Я использую AsyncTask
(1) в другом AsyncTask
(2). AsyncTask 1 извлекает пользовательские данные из сети, подсчитывает количество записей в ответе и для каждой записи в onPostExecute
отображает имя пользователя и запускает новую AsyncTask (2), чтобы получить изображение с сервера и загрузить его в ImageView
. Все это происходит в onPostExecute
. Это работает безупречно, пользовательские данные извлекаются и отображаются, а изображения отображаются одно за другим для каждой записи.
Однако итерация по массиву и обновление TextView
в AsyncTask
1 в onPostExecute
происходит так быстро, что в основном отображается только последнее имя пользователя в массиве, остальные загружаются, но их невозможно обнаружить человеческим глазом :)
Между тем, AsyncTask
2 по-прежнему загружает изображения из Интернета и показывает изображения профилей не тем пользователям. Проблема, которая у меня здесь, очевидно, заключается в том, что эти 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