0

在我的应用程序中,我需要从 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) {               



        }
  }
4

2 回答 2

0

两个任务都完成后,使用 Handler 发送消息,或者您可以在每个异步任务完成后更新 UI。

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

选项 1(伪代码)

// 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 并拥有一个管理器,该管理器将知道每个异步任务的当前状态,一旦两个任务都完成,然后发送类似于上面的消息。

选项 3

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

于 2013-10-15T09:53:07.893 回答
0

摆脱readJsonTask. 而是在方法中(或您认为更合适的任何地方)开始您的downloadUrl任务,并在's update 与获取的 json 相关的 UI 部分。onCreatedownloadUrlonPostExecute

于 2013-11-12T15:07:57.220 回答