Android AsyncTask – 执行顺序

我正面临着关于AsyncTasks执行顺序的问题。

我的问题是:

假设我有2个AsyncTask实现: MyAsyncTask1MyAsyncTask2

以下列方式调用:

new MyAsyncTask1 ().execute (); new MyAsyncTask2 ().execute (); 

是否保证MyAsyncTask1MyAsyncTask2之前执行? 有一点可以肯定,它们不是并行执行的,因为使用了默认执行程序,即SERIAL_EXECUTOR 。 问题在于执行的顺序:哪个将首先执行?

如果未确定执行顺序,我如何强制执行A​​syncTasks的执行顺序?

我需要的是在MyAsyncTask2之前执行MyAsyncTask1 ,但事实并非如此,尽管我在MyAsyncTask2之前调用了MyAsyncTask1的执行。

我实际拥有的是自定义活动:

 public abstract class CustomActivity extends Activity { @Override protected void onCreate ( Bundle savedInstanceState ) { super.onCreate ( savedInstanceState ); new MyAsyncTask2 ().execute (); } } 

以及从自定义活动inheritance的另一个活动:

 public class MainActivity extends CustomActivity { @Override protected void onCreate ( Bundle savedInstanceState ) { new MyAsyncTask1 ().execute (); super.onCreate ( savedInstanceState ); } } 

因此,如果我使用MainActivityMyAsyncTask1应该在MyAsyncTask2之前执行,至少这是我需要的行为。

确保两个线程(即AsyncTasks基本上是什么)按照您想要的顺序执行的唯一方法是在第一个线程完成时启动第二个线程。

在你的情况下,为了保持实现抽象而不必在AsyncTask1的onPostExecute中实际调用AsyncTask2(Anup和Sanket建议的方式,如果你想混合它们也没关系),让AsyncTask1调用super.executeAsyncTask2() ,其中executeAsyncTask2()是CustomActivity中的一个方法,它启动第二个AsyncTask

为了“链接”任意数量的AsyncTasks,我所做的是让我的AsyncTasks接收自定义Callback作为参数。 你只需要像这样定义它:

 public interface AsyncCallback(){ public void onAsyncTaskFinished(); } 

你的AsyncTask实现构造函数应该有一个AsyncCallback作为参数,如下所示:

 private AsyncCallback callback; public AsyncTaskImplementation(AsyncCallback callback){ //Do whatever you're doing here this.callback = callback; } 

当然,如果他们有更多参数,请不要删除它们。

然后,就在onPostExecute结束之前,介绍一下:

 if (callback != null) callback.onAsyncTaskFinished(); 

因此,如果传递回调,AsyncTask将在主线程中执行回调。 如果您不想执行任何回调,只需传递null

因此,要调用您的AsyncTask链,您只需编写:

 new AsyncTask1(new AsyncCallback(){ public void onAsyncTaskFinished(){ new AsyncTask2(null).execute(); } }).execute(); 

我希望这可以帮助你 ;-)

在第一个Aysnc任务结束时(即在第一个异步任务的onPostExecute()方法结束时onPostExecute()第二个异步任务)

 //first async task's onPostExecute method onPostExecute() { //do your stuff and call second async task new MyAsyncTask2 ().execute (); } 

这将保证在第一个任务之后以简单而优雅的方式执行第二个任务。

在任务1的onPostExecute中调用第二个任务为

 @Override protected void onPostExecute(String string){//String or whatever u passed new MyAsyncTask2 ().execute (); } 

AsyncTask在后台执行,所以在你的情况下,第一个代码将启动task1并立即启动task2 ..所以调用

 new MyAsyncTask2 ().execute (); 

这是对Task1的后期执行

不要让事情变得复杂,并尽量保持设计简洁。 两个AsyncTasks之间的竞争取决于它们在覆盖的方法中携带的处理量。 从逻辑上讲,如果您希望AsyncTask1在AsyncTask2之前完成,那么只需在第一个Async中添加第二个Async的代码块。

或者从第一个Async的onPostExecute启动第二个Async – 但就个人而言,这似乎是不必要的。