【问题标题】:Need design pattern suggestion: AsyncTask included需要设计模式建议:包括 AsyncTask
【发布时间】:2015-05-06 19:17:35
【问题描述】:

这是我目前的情况。

Class Foo{
    public static boolean isAsyncTask1Done;
    public static boolean isAsyncTask2Done;
    AsyncTask1(); //in onPostExecute make isAsyncTask1Done= true
    AsyncTask2(); //in onPostExecute make isAsyncTask2Done= true
    //execute the following method after the above 2 complete.

    if (isAsyncTask1Done == true && isAsyncTask2Done == true)
        doPostProcessing();
}

现在这个类也是一个活动。也因为 AsyncTask1();和 AsyncTask2();需要一些时间,我已将它们设为异步任务(我可能会将它们设为 intentservice)。

现在我的问题是我应该如何调用 doPostProcessing() ?我只需要在 AsyncTask1() 和 AsyncTask2() 完成后调用它。

谢谢

【问题讨论】:

  • AcyncTasks 是否需要同时运行?或者你可以在第一个完成后开始第二个吗?
  • 我认为你应该使用两个线程,运行它并使用 join() 等待它们完成工作。
  • 只是一个修复 - 你需要三个线程。一个 MainThread 将运行另外两个线程并加入它们。当它们完成时,MainThread 将调用回调。
  • @DanielNugent :任何订单都可以。我希望它们都是AcyncTasks,以便它们都可以在 2 diff 中运行。线程和处理速度更快,因为假设按顺序执行它们。另外,就像我之前说的那样,他们会饿着肚子,所以我不希望他们把 UI 作为标准。方法。
  • @AlexanderRavikovich 我猜你更接近解决方案。只是想确保当您说线程时,这些是常规的 java threads 而不是 AcyncTasks 或“IntentService”。

标签: android android-asynctask android-intentservice


【解决方案1】:

您设置示例的方式是行不通的。该事件需要由最后一个AsyncTask完成触发。

启动异步任务:

new AsyncTask1.execute();
new AsyncTask2.execute();

然后,当最后一个完成后,调用doPostProcessing()

编辑:添加了synchronized 块。

    private boolean asyncTask1Completed = false;
    private boolean asyncTask2Completed = false;
    private boolean ranPostProcessing = false;

    private class AsyncTask1 extends AsyncTask<String, Void, String> {

        @Override
        protected void onPreExecute() {
            //......
        }

        @Override
        protected String doInBackground(String... params) {
            String result = "result";
            //......
            return result;
        }

        @Override
        protected void onPostExecute(String result) {

            asyncTask1Completed = true;

            synchronized(MainActivity.this) {
                if (asyncTask2Completed && !ranPostProcessing) {
                    ranPostProcessing = true;
                    //Call doPostProcessing once both AsyncTasks are complete:
                    doPostProcessing();
                }
            }


        }
    }

    private class AsyncTask2 extends AsyncTask<String, Void, String> {

        @Override
        protected void onPreExecute() {
            //......
        }

        @Override
        protected String doInBackground(String... params) {
            String result = "result";
            //......
            return result;
        }

        @Override
        protected void onPostExecute(String result) {

            asyncTask2Completed = true;

            synchronized(MainActivity.this) {
                if (asyncTask1Completed && !ranPostProcessing) {
                    ranPostProcessing = true;
                    //Call doPostProcessing once both AsyncTasks are complete:
                    doPostProcessing();
                }
            }
        }
    }

【讨论】:

  • 有可能 doPostProcessing();如果两个任务同时完成,将运行两次。问题是从两个任务并发访问变量 ranPostProcessing...这可能在 99% 中有效,但在 1% 中此代码可能会运行 doPostProcessing() 两次并破坏所有系统...
  • @AlexanderRavikovich 这是真的。我想使用synchronized 块来调用doPostProcessing() 可以解决它。老实说,我认为您在 cmets 中提出的建议将是最好的途径。
【解决方案2】:

在 task1 的 PostExcecute 中,您检查 task2 是否已完成。如果是这样,请执行后执行。如果没有,什么也不做。 task2 检查任务 1 是否已完成也是如此。

你需要 .execute() 任务。

而且我敢肯定,如果您仔细查看您的应用程序,还有比这更好的方法。

【讨论】:

    猜你喜欢
    • 2013-11-26
    • 2014-03-30
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 2010-10-18
    • 2014-10-22
    相关资源
    最近更新 更多