需要设计模式建议:包括AsyncTask

时间:2015-05-06 19:17:35

标签: android android-asynctask android-intentservice

这是我目前的情况。

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()时调用它。

由于

2 个答案:

答案 0 :(得分:0)

您设置示例的方式,它将无法正常工作。该事件需要由最后AsyncTask完成触发。

启动AsyncTasks:

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

答案 1 :(得分:0)

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

你需要执行.execute()任务。

我确信,如果你仔细查看你的应用程序,那么有更好的方法来做到这一点。