【问题标题】:Returning a value from AsyncTask to main class从 AsyncTask 返回一个值到主类
【发布时间】:2015-06-30 09:24:42
【问题描述】:

我是 android 新手,我开发了一个应用程序来发布并从 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);

我收到错误无法比较的类型错误。

谁能帮我把返回的值放到主类中

【问题讨论】:

  • 看看here。 Yon 可以轻松适应您的情况
  • 您可以实现一个接口并在其回调中获取值

标签: java android android-asynctask


【解决方案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】:

    基于answer @BlackBelt 链接...这将为您解决问题:

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

    【讨论】:

    • IMO,这不太理想1.) 不要以为你会尽快得到回复,小心网络问题2.) 由于结果是异步的产物,如果在异步返回任何结果之前使用此值,您可能会得到空指针。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      但是要实现你的目标,你可以使用onPostExecute() asynctask 方法

      onPostExecute(String result) {
          yourTextView.setText(result);
      }
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-03-16
          • 1970-01-01
          • 1970-01-01
          • 2014-03-10
          • 2012-08-21
          • 1970-01-01
          • 2019-02-20
          • 1970-01-01
          相关资源
          最近更新 更多