3

AsyncTask(1) を別のAsyncTask(2)で使用しています。AsyncTask 1 は、オンライン ユーザー データを取得し、応答内のエントリ数をカウントし、エントリごとにonPostExecuteユーザー名を表示し、新しい AsyncTask (2) を実行してサーバーから画像を取得し、ImageView. これはすべて で行われonPostExecuteます。これは問題なく機能しており、ユーザー データが取得されて表示され、画像がエントリごとに 1 つずつ表示されます。

ただし、配列の反復とTextViewin AsyncTask1の更新はonPostExecute非常に高速に行われるため、基本的に配列内の最後のユーザー名のみが表示され、他のユーザー名は読み込まれますが、人間の目では検出できません:)

一方、AsyncTask2 は依然としてオンラインから画像を取得しており、間違ったユーザーのプロフィール画像を表示しています。ここで私が明らかに抱えている問題は、これら 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
4

1 に答える 1

8

複数の名前でsetTextシングルを呼んでいる理由はよくわかりません。TextViewあなたが言及したように、あなたはsetTextすべての名前を持っていましたが、単一の名前しか表示されません。またはそのようなものを使用する必要があるかもしれませんListView

あなたの質問に関して:おそらく2つは必要ありませんAsyncTask。すべてを 1 つで実行できます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
于 2012-06-09T18:11:32.887 に答える