有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将值从AsyncTask返回到主类

我是安卓新手,我开发了一个应用程序来发布和获取php服务器的响应

异步任务

    class MyTask extends AsyncTask<String, Void, String> {


    @Override
    protected String doInBackground(String... arg0) {


        // Create a new HttpClient and Post Header
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://172.16.110.3/agent_tracking/index.php/api/rest/auth");

        try {
            // Add your data
            List<BasicNameValuePair> nameValuePairs = new ArrayList<>(1);
            nameValuePairs.add(new BasicNameValuePair("key", arg0[0]));
           // nameValuePairs.add(new BasicNameValuePair("stringdata", "Hi"));
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            // Execute HTTP Post Request
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            String responseString = EntityUtils.toString(entity, "UTF-8");

            return responseString;

        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
        } catch (IOException e) {
            // TODO Auto-generated catch block
        }
        return null;
    }
}

主类

  Button login = (Button) findViewById(R.id.btn_login);
    login.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            EditText username = (EditText) findViewById(R.id.et_user_name);
            EditText password = (EditText) findViewById(R.id.et_password);

            String user_name = username.getText().toString();
            String paswrd = password.getText().toString();
            String timeStamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime());

            String data2 = user_name + "|" + paswrd + "|" + timeStamp;

            byte[] data = new byte[0];
            try {
                data = data2.getBytes("UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            String base64 = Base64.encodeToString(data, Base64.DEFAULT);

            show_message(base64);
            new MyTask().execute(base64);
            //postData();
            //startActivity(new Intent(MainActivity.this, mainmenu.class));
        }
    });

我的问题是我从AsyncTask返回了一个名为responseString的值。我想从主类捕获该值,并将其显示在消息框中

我试过这样做

     String result = new MyTask().execute(base64);

我得到的错误是不可比较类型错误

有人能帮我把返回的淡水河谷送到主舱吗


共 (5) 个答案

  1. # 1 楼答案

    实现这一点有多种方法。我将分步骤描述这种方法:

    1)在活动中创建一个方法,该方法将对活动执行所需的操作,如

    public void showData(String responseString)
    {
        tvText.setText(responseString)
    }
    

    2)在asyncTask中调用asyncTask传递活动对象时,如

    new MyTask(MainClass.this).execute(base64);
    

    3)从onPostExecute调用showData方法,如:

    mainclassObj.showData(response);
    
  2. # 2 楼答案

    它必须通过响应回调来处理。在成功或失败的情况下触发。我建议您使用像loopj或volley这样的网络管理库,它负责请求线程和回调

  3. # 3 楼答案

    您不能直接从异步方法返回任何数据,就像您发布的String result = new MyTask().execute(base64);

    但是为了实现您的目标,您可以使用asynctask的onPostExecute()方法

    onPostExecute(String result) {
        yourTextView.setText(result);
    }
    
  4. # 4 楼答案

    基于answer@BlackBelt链接的。。。这将为您带来好处:

    String result = new MyTask().execute(base64).get();
    
  5. # 5 楼答案

    您可以重写AsyncTask的onPostExecute方法。返回值(responseString)是onPostExecute的参数。然后可以使用参数显示消息