等待AsyncTask

时间:2013-10-15 09:10:50

标签: android multithreading android-asynctask

在我的应用程序中,我需要从2个不同的URL下载一些数据,然后填充列表。为此,我创建了一个2个AsyncTask类。第一类负责从相应的URL下载数据。另一个负责执行上述asyncTasks,然后在UI线程上填充列表。我需要下载数据并行运行的任务,所以我在执行程序上执行它们。我的问题是负责填充列表的任务在其他两个任务下载数据之前终止。如何让该线程等待其他两个返回。我应该在其他人身上使用.get,因为我需要它们并行运行。我也发布了一些代码以便明确。

    protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);

                          readJsonTask task = new readJsonTask(this);


          task.execute();
    }

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

            @Override
            protected String doInBackground(String... args) {

              downloadUrl task = new downloadUrl(url1,"jsonData1","/sdcard/appData/LocalJson/jsonData1");
              task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

              downloadUrl task1 = new downloadUrl(url2,"jsonData2","/sdcard/appData/LocalJson/jsonData2");
              task1.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

             return "done"; 

      }


        @Override
        protected void onPostExecute(String result) {

            //update UI

        }
    }


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

        private String url;
        private String targetFolder;
        private String pathForLoad;



            @Override
        protected String doInBackground(String... args) {               


            //download Data


            return "done"; 
        }

        @Override
        protected void onPostExecute(String result) {               



        }
  }

2 个答案:

答案 0 :(得分:0)

在两个任务完成后使用处理程序分派消息,或者在每个异步任务完成后更新UI。

另外,如果你指的是一个引用主线程的线程,你可以让它等待,但这不是首选的方法。

选项1(Psuedo代码)

// The code here will dispatch a message which will tell the handler
// to attempt and update, however; the handler will only process it
// if both options have complete their work then reset their state

boolean mJob1complete
boolean mJob2complete

AsyncTask(1)
{
 When finished
 mJob1complete = true;
 dispatch(message)
}

AsyncTask(2)
{
 When finished
 mJob2complete = true;
 dispatch(message)
}

Handler()
{
 onMessage()
 if(mJob1complete && mjob2complete)
 {
  udpateui // Make sure to run this update on the ui thread with something like runOnUiThread()
  // reset state
  mJob1complete = false;
  mJob2complete = false;
 }
}

选项2

为了在两个任务完成后调度消息,解决方案是组织AsyncTasks并让管理员知道每个asynctask的当前状态,一旦完成,然后发送类似于上方。

选项3

只需在每次AsyncTask完成后更新UI,这将更容易和更清晰,因为您不必维护状态。

答案 1 :(得分:0)

摆脱readJsonTask。而是在downloadUrl方法中(或您认为更合适的地方)开始执行onCreate任务,并在downloadUrl onPostExecute更新与UI相关的部分内容获取的json。