在我的应用程序中,我需要从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) {
}
}
答案 0 :(得分:0)
在两个任务完成后使用处理程序分派消息,或者在每个异步任务完成后更新UI。
另外,如果你指的是一个引用主线程的线程,你可以让它等待,但这不是首选的方法。
// 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;
}
}
为了在两个任务完成后调度消息,解决方案是组织AsyncTasks并让管理员知道每个asynctask的当前状态,一旦完成,然后发送类似于上方。
只需在每次AsyncTask完成后更新UI,这将更容易和更清晰,因为您不必维护状态。
答案 1 :(得分:0)
摆脱readJsonTask
。而是在downloadUrl
方法中(或您认为更合适的地方)开始执行onCreate
任务,并在downloadUrl
onPostExecute
更新与UI相关的部分内容获取的json。