我AsyncTask
在另一个AsyncTask
(2) 中使用 (1)。AsyncTask 1 获取在线用户数据,计算响应中的条目数,对于每个条目,onPostExecute
显示用户名并运行新的 AsyncTask (2) 从服务器获取图像并将其加载到ImageView
. 这一切都发生在onPostExecute
. 这是完美的工作,用户数据被获取并显示,并且图像为每个条目一张一张地显示。
然而,数组的迭代和TextView
in AsyncTask
1的更新onPostExecute
发生得如此之快,它基本上只显示数组中的最后一个用户名,其他的都被加载了,但肉眼无法检测到:)
同时,AsyncTask
2 仍在从网上获取图片,并为错误的用户显示个人资料图片。显然我在这里遇到的问题是这两个需要同步。AsyncTask
所以我以为我只是用该方法等待 2 中的输出get()
,但现在什么都没有更新了,不TextView
……这对我来说是意外的行为。
那么,问题是如何同步 2 AsyncTask
s?
一些代码来澄清,如果它仍然需要
//instantiate first AsyncTask
new AsyncRequest().execute(bundle);
private class AsyncRequest extends AsyncTask<Bundle, Void, String> {
protected String doInBackground(Bundle... bundle) {
String data = null;
try {
data = request(null, bundle[0]); //request the data
return data;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return data;
}// end method
protected void onPostExecute(String response) {
JSONArray data = null;
try {
JSONObject response2 = Util.parseJson(response);
data = response2.optJSONArray("data");
int amount = data.length();
TextView s1 = (TextView) findViewById(R.id.some_id);
s1.setText("" + amount); //displays number of items
//display the data
for(int i=0; i<amount; i++){
String email = "";
String id = "";
JSONObject json_obj = data.getJSONObject(i);
Log.d("JSONObject ", ""+json_obj);
String name = json_obj.getString("name");
if (json_obj.has("email")){
email = json_obj.getString("email");
}
if (json_obj.has("id")){
id = json_obj.getString("id");
}
String picture = "http://www.domain.com/"+id+"/picture";
TextView s2 = (TextView) findViewById(R.id.name_placeholder);
s2.setText(name);
//here we do a new AsynTask for each entry and wait until the data is fetched
new DownloadProfileImageTask().execute(picture, name).get();
}
} catch (JSONException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}// end method