Android AsyncTask - 执行顺序

时间:2012-11-05 08:00:04

标签: android android-asynctask

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

我的问题是:

假设我有2个AsyncTask实现: MyAsyncTask1 MyAsyncTask2

以下列方式调用:

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

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

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

我需要的是在 MyAsyncTask2 之前执行 MyAsyncTask1 ,但情况并非总是如此,尽管我之前正在调用 MyAsyncTask1 的执行的 MyAsyncTask2

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

public abstract class CustomActivity extends Activity {

    @Override
    protected void onCreate ( Bundle savedInstanceState ) {
        super.onCreate ( savedInstanceState );
        new MyAsyncTask2 ().execute ();
    }
}

另一个继承自定义活动的活动:

public class MainActivity extends CustomActivity {

    @Override
    protected void onCreate ( Bundle savedInstanceState ) {
        new MyAsyncTask1 ().execute ();
        super.onCreate ( savedInstanceState );
    }
}

因此,如果我使用 MainActivity MyAsyncTask1 之前应执行 MyAsyncTask1 ,至少这是我需要的行为。

6 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

为了“链接”任意数量的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();

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

答案 2 :(得分:0)

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

//first async task's onPostExecute method

onPostExecute()
{
//do your stuff and call second async task

new MyAsyncTask2 ().execute ();

}

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:-1)

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

new MyAsyncTask2 ().execute ();

这是对Task1的后执行

答案 5 :(得分:-1)

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

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