我正在开发一个需要使用AsyncTask进行网络连接的 Android 应用程序。我从主线程调用它。所以doInBackground方法运行,然后返回到onPostExecute方法。执行 onPostExecute 方法后,我想将一个值返回给调用它的活动,因为我必须在该特定活动中进行一些操作,这需要从 onPostExecute 方法返回的值。我该如何解决这个问题?如何从 onPostExecute 返回值?
提前致谢
我正在开发一个需要使用AsyncTask进行网络连接的 Android 应用程序。我从主线程调用它。所以doInBackground方法运行,然后返回到onPostExecute方法。执行 onPostExecute 方法后,我想将一个值返回给调用它的活动,因为我必须在该特定活动中进行一些操作,这需要从 onPostExecute 方法返回的值。我该如何解决这个问题?如何从 onPostExecute 返回值?
提前致谢
AsyncTask,顾名思义,与 UI 线程异步运行,onPostExecute 方法将在未来某个时间点,当 doInBackground 完成时被调用。我们不关心什么时候会调用 onPostExecute 方法(实际上在项目构建时无法判断),我们唯一关心的是 onPostExecute 方法保证在将来某个时候被底层框架正确调用。所以 onPostExecute 方法的目的是处理工作线程返回的结果,这也是为什么 onPostExecute 方法的唯一参数是 doInBackground 方法返回的结果。
我必须在需要从 onPostExecute 方法返回的值的特定活动中进行一些操作。我该如何解决这个问题?
当然,您可以在 Activity 类中创建一些实例变量(或使用侦听器模式),在 onPostExecute 方法中存储返回并准备好的结果。问题是你永远不知道这个结果何时在项目构建时在 onPostExecute 方法之外准备好,因为它实际上是在应用程序运行时确定的。除非你写一些等待机制不断地轮询结果,从而牺牲了 AsyncTask 的好处,例如,内置的 API AsyncTask.get()使得 AsyncTask 与 UI 线程同步运行并将结果返回给 Activity。
最佳实践是更改您的设计并将需要从 AsyncTask 返回的结果的操作代码移动到 onPostExecute 方法中。希望这可以帮助。
您可以使用 getter 和 setter 从AsyncTask
public class MainActivity extends Activity {
public String retunnumfromAsyncTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layouttest);
new Asyntask(this).execute();
}
public class Asyntask extends AsyncTask<Void, Void, String> {
private final Context Asyntaskcontext;
public Asyntask(Context context){
Asyntaskcontext = context;
}
@Override
protected void onPostExecute(String result) {
MainActivity mainactivity = (MainActivity) Asyntaskcontext;
mainactivity.retunnumfromAsyncTask = result;
super.onPostExecute(result);
}
}
}
只需将 AsyncTask 类作为内部类写入您的活动,然后将您想要返回的任何值声明为全局。是不是对您有帮助?