一个接一个地执行asynctask两次

时间:2014-03-20 02:23:55

标签: android android-asynctask

我正在研究需要多次执行asynctask的android应用程序 并且每一个都应该在前一个完成后执行

这是描述我的问题的简单片段

String text1="text1";
String text2="text2";
new asynctask().execute(text1);
new asynctask().execute(text2);

但是我面临的问题是两个asynctask并行运行,而不是前一个执行下一个asynctask。

3 个答案:

答案 0 :(得分:0)

实现将跟踪实例状态的状态机。在onPostExecute()函数中,调用一个方法来检查实例的状态,并采取适当的行动(如果需要,再次调用AsyncTask等)

答案 1 :(得分:0)

由于您的目标是API 10,因此串行线程池不适用于您的AsyncTask,但您可以创建自己的。您可以将其扩展到您可能需要的任何AsyncTask功能......

首先,创建一个串行执行的线程池,a.k.a。,一个线程。

public enum SerialTaskExecutor {
    INSTANCE;

    public static SerialThreadPool getInstance() {
        return INSTANCE;
    }

    private final ExecutorService mExecutor;
    private final Handler mMainHandler;

    private SerialThreadPool() {
        mExecutor = Executors.newSingleThreadExecutor();
        mMainHandler = new Handler(Looper.getMainLooper());
    }

    public void executeTask(final SerialTask<P, R> t, final P... params){
        if(t == null){
            return;
        }

        mExecutor.execute(new Runnable(){

            @Override
            public void run(){
                final R result = t.doInBackground(params);

                mMainHandler.post(new Runnable(){

                    @Override
                    public void run(){
                        t.onMainThread(result);
                    }
                });
            }

        });
    }
}

然后定义您的串行任务接口:

public interface SerialTask<P, R> {
    public R doInBackground(P... params);
    public void onMainThread(R result);
}

最后,不是实现AsyncTask,而是实现SerialTask​​:

public MyTextTask implements SerialTask<String, Void> {

    @Override
    public Void doInBackground(String... params) {
         // do my string processing here
         return null;
    }

    @Override
    public void onMainThread(Void result) 
         // update ui here
    }
}

现在您的简单代码段变为:

String text1="text1";
String text2="text2";
SerialTaskExecutor exe = SerialTaskExecutor.getInstance();
exe.executeTask(new MyTextTask(), text1);
exe.executeTask(new MyTextTask(), text2);

答案 2 :(得分:0)

您还可以使用以下代码行等待第一个AsyncTask完成:

String firstTask =  new asynctask().execute(text1).get();

,然后

String secondTask = new asynctask().execute(text2).get();

它将等到你的第一次完成。但是你的UI会被阻止。