11

我面临一个关于 AsyncTasks 执行顺序的问题。

我的问题是:

假设我有 2 个 AsyncTask 实现:MyAsyncTask1MyAsyncTask2

以下列方式调用:

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

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

如果未确定执行顺序,如何强制执行 AsyncTasks 的执行顺序?

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

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

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 );
    }
}

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

4

6 回答 6

5

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

在您的情况下,为了保持实现抽象并且不必在 AsyncTask1 中实际调用 AsyncTask2 onPostExecute(Anup 和 Sanket 建议的方式,如果您想混合它们也可以),请进行 AsyncTask1 call super.executeAsyncTask2(),其中executeAsyncTask2()是您的 CustomActivity 中的一个方法启动第二个 AsyncTask

于 2012-11-05T08:10:50.353 回答
3

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

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();

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

于 2012-11-05T11:08:16.130 回答
0

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

//first async task's onPostExecute method

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

new MyAsyncTask2 ().execute ();

}

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

于 2012-11-05T08:05:40.660 回答
0

在任务 1 的 onPostExecute 中调用 2nd Task 为

@Override
protected void onPostExecute(String string){//String or whatever u passed
    new MyAsyncTask2 ().execute ();
}
于 2012-11-05T08:08:04.143 回答
-1

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

new MyAsyncTask2 ().execute ();

这在 Task1 的 postexecute 中

于 2012-11-05T08:05:25.877 回答
-1

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

或者从你的第一个异步的onPostExecute启动你的第二个异步 - 但就个人而言,这似乎没有必要。

于 2012-11-05T08:08:03.707 回答