finsih执行后,Android AsyncTask获取结果

时间:2016-03-23 09:19:30

标签: android android-asynctask

我有一个扩展AsyncTask的类

public class MyClass extends AsyncTask<Void, Void, Void> {
    private String response;

    public String getResponse(){
        return response;
    }

    @Override
    protected Void doInBackground(Void... arg0) {
         /* code */
         return null;
    }
    @Override
    protected void onPostExecute(Void result) {
        response = aString;
        super.onPostExecute(result);
    }
}

在其他活动中,我创建了一个MyClass

的实例
 MyClass c = new MyClass();
 c.execute();
 response = c.getResponse();
 Toast.makeText(getApplicationContext(), "response = " + response, Toast.LENGTH_LONG).show();

但是我在响应变量上得到null,可能是因为Toast在任务完成之前执行了。你能给我正确的方法,以便在完成任务后得到结果吗?

3 个答案:

答案 0 :(得分:3)

您不需要结果的类字段。 AsyncTask<Params, Progress, Result>提供您需要的一切。

所以你希望从任务中获得String。为了实现这一目标,您必须将Result更改为String。基本上是这样的:

public class MyClass extends AsyncTask<Void, Void, String> {

    @Override
    protected String doInBackground(Void... arg0) {
         /* do background stuff to get the String */
         return string; // the one you got from somewhere
    }
}

您还必须通过调用方法get()等待计算。

String response = new MyClass().execute().get();
Toast.makeText(getApplicationContext(), "response = " + response, Toast.LENGTH_LONG).show();

详细了解AsyncTask#get here

答案 1 :(得分:1)

AsyncTask在一个单独的线程上异步执行。这意味着当您调用response = c.getResponse();时,任务仍在忙着执行。您可以在onPostExecute中处理结果,也可以使用BroadcastReceiver或EventBus通知您的活动任务已完成。

答案 2 :(得分:0)

在MyClass中创建一个构造函数,其中Context of activity作为参数,如下面的

 Context context;

 public MyClass(Context context){
    this.context = context;
 }

// make toast in onPostExecute
 @Override
 protected void onPostExecute(Void result) {
      super.onPostExecute(result);
      Toast.makeText(context, "response = " + result, Toast.LENGTH_LONG).show();
 }

在另一个活动中调用asynctask,如下面的

 MyClass c = new MyClass(YourActivity.this);
 c.execute();