2

我在另一個AsyncTask(2)中使用AsyncTask(1)。 AsyncTask 1提取在線用戶數據,統計響應中的條目數,並在onPostExecute中顯示用戶名並運行新的AsyncTask(2)以從服務器獲取圖像並將其加載到ImageView中。這一切都發生在onPostExecute。 這是完美的工作,用戶數據被提取和顯示,圖像逐一顯示爲每個條目。嵌套的AsyncTask和onPostExecute

然而,通過陣列的itteration和TextViewAsyncTask更新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 

回答

7

爲什麼你有多個名字的名字叫單TextViewsetText這是不太清楚。正如你所提到的,儘管你有所有名字的setText,你只能看到一個名字。可能是你需要使用ListView或類似的東西。

現在關於你的問題:可能你不需要兩個AsyncTask s。您可以在一個AsyncTask中完成所有工作。代碼將如下所示:

//Create a Holder class as a data holder. 
//For simplicity, public attributes are used 
class Holder{ 
    public String name; 
    public String email; 
    public String id; 
    public BitmapDrawable imageDrawable; 
} 

//instantiate the AsyncTask 
new AsyncRequest().execute(bundle); 

private class AsyncRequest extends AsyncTask<Bundle, Holder, Integer> { 
protected Integer doInBackground(Bundle... bundle) { 
    int amount = 0; 
    try { 
     data = request(null, bundle[0]); //request the data 

     JSONArray data = null; 
     JSONObject response2 = Util.parseJson(response); 
     data  = response2.optJSONArray("data"); 
     amount = data.length(); 

     //display the data 
     for(int i=0; i<amount; i++){ 
      Holder holder = new Holder(); 
      holder.email  = ""; 
      holder.id   = ""; 
      JSONObject json_obj = data.getJSONObject(i); 
      Log.d("JSONObject ", ""+json_obj); 
      holder.name   = json_obj.getString("name"); 
      if (json_obj.has("email")){ 
       holder.email   = json_obj.getString("email"); 
      } 
      if (json_obj.has("id")){ 
       holder.id   = json_obj.getString("id"); 
      } 
      String picture = "http://www.domain.com/"+id+"/picture"; 

      //Fetch the image and create a Drawable from it - Synchronously 
      holder.imageDrawable = getImageDrawable(picture, name); 

      publishProgress(holder); 

     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return amount; 
}// end method 

protected void onProgressUpdate(Holder... holder) { 
    //Update the user name and image 
    TextView s2  = (TextView) findViewById(R.id.name_placeholder); 
    s2.setText(holder[0].name); 

    ImageView imgView = (ImageView) findViewById(R.id.imageViewId); 
    imgView.setImageDrawable(holder[0].imageDrawable); 

} 

protected void onPostExecute(Integer amount) { 
    TextView s1 = (TextView) findViewById(R.id.some_id); 
    s1.setText(amount.toString()); //displays number of items 
}// end method 
+0

哇,爲什麼我沒有想到這個?其實很簡單非常感謝您花時間修改我的代碼並將其作爲答案!我需要對它進行一些小的修改才能正常工作,並相應地更新了您的答案。再次感謝。 – slinden77

+1

PS:我正在更新單個TextView,因爲我想顯示請求中找到的配置文件的用戶信息。所有這些都是在單個頁面/活動上完成的。以後我會實際做一些有用的活動;) – slinden77