AsyncTask
(1) を別のAsyncTask
(2)で使用しています。AsyncTask 1 は、オンライン ユーザー データを取得し、応答内のエントリ数をカウントし、エントリごとにonPostExecute
ユーザー名を表示し、新しい AsyncTask (2) を実行してサーバーから画像を取得し、ImageView
. これはすべて で行われonPostExecute
ます。これは問題なく機能しており、ユーザー データが取得されて表示され、画像がエントリごとに 1 つずつ表示されます。
ただし、配列の反復とTextView
in AsyncTask
1の更新はonPostExecute
非常に高速に行われるため、基本的に配列内の最後のユーザー名のみが表示され、他のユーザー名は読み込まれますが、人間の目では検出できません:)
一方、AsyncTask
2 は依然としてオンラインから画像を取得しており、間違ったユーザーのプロフィール画像を表示しています。ここで私が明らかに抱えている問題は、これら 2 つが同期している必要があることです。AsyncTask
だから私はメソッドで2の出力を待つだけだと思っていましたget()
が、今は何も更新されていません。いやTextView
...これは私にとって予期しない動作です。
では、問題は 2 を同期する方法AsyncTask
です。
まだ必要な場合は、明確にするためのコードのビット
//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