我有一个扩展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在任务完成之前执行了。你能给我正确的方法,以便在完成任务后得到结果吗?
答案 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();
答案 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();