【问题标题】:execute asynctask twice one after other依次执行两次 asynctask
【发布时间】:2014-03-20 02:23:55
【问题描述】:

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

这里用一个简单的 sn-p 来描述我的问题

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

但我面临的问题是两个异步任务并行运行,而不是在前一个完成执行下一个时。

【问题讨论】:

  • 将第二个的执行移到第一个的onPostExecute中
  • 它不只是两个电话,我可能需要多达 5 个电话或更多
  • 我们可以知道您到底想做什么吗?因为听起来你误解了 / - 使用 AsyncTasks 应该使用的方式。
  • @user3390830 你得到答案了吗?

标签: android android-asynctask


【解决方案1】:

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

首先,创建将串行执行事物的线程池,也就是单个线程。

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

现在你的简单 sn-p 变成:

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

【讨论】:

  • SERIAL_EXECUTOR 无法解析或不是字段...任何想法
  • 您的目标 API 级别是什么?
  • 使用代码示例更新了答案,以解决在 api 级别 10 上没有可用的默认执行程序的问题。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    那么

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

    它会等到你的第一个完成。但是你的 UI 会被屏蔽。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 2011-11-30
    • 1970-01-01
    相关资源
    最近更新 更多