1

asynctaskクラスファイルからこれによって設定された配列リストにアクセスする際に問題がありますA。クラスファイルからB、次のようなメソッドを使用しようとします

inStream = new InboxLoader(MainInbox.this,1); Log.e("JJJ",""+inStream.getMemId().size());

class public class InboxLoader { Context ctx indexoutofbounds error ; ArrayListmemName、memAvatar、msgBody、msgTime; ArrayList msgId,memId;AsyncTaskB

InboxLoader(Context context,int id){
    this.ctx = context;
    this.msgBody   = new ArrayList<String>();
    this.memAvatar = new ArrayList<String>();
    this.memId     = new ArrayList<Integer>();
    this.memName   = new ArrayList<String>();
    this.msgTime   = new ArrayList<String>();
    this.msgId     = new ArrayList<Integer>();


    new LoadStream().execute(id);

}


public ArrayList<String> getMsgBody(){
    return msgBody;
}

public ArrayList<String> getMemAvatar(){
    return memAvatar;
}

public ArrayList<Integer> getMemId(){
    return memId;
}

public ArrayList<String> getMemName(){
    return memName;
}

public ArrayList<Integer> getMsgId(){
    return msgId;
}

public ArrayList<String> getMsgTime(){
    return msgTime;
}

/*
 * STARTS GRABBING DATA FOR THE LISTVIEW
     */

public class LoadStream extends AsyncTask<Integer, Integer, JSONObject> {
    ProgressDialog progressBar;

    @Override
    protected void onPreExecute() {
            progressBar = new ProgressDialog(ctx, ProgressDialog.STYLE_SPINNER);
            progressBar.setMessage("Generating Inbox....");
            progressBar.show();

        super.onPreExecute();
    }

    @Override
    protected JSONObject doInBackground(Integer... params) {
        List<NameValuePair> params2 = new ArrayList<NameValuePair>();
        params2.add(new BasicNameValuePair("memberId", String.valueOf(1)));
        params2.add(new BasicNameValuePair("type", "get"));
        JSONObject json = new jsonParser().makeRequest("url", params2);
        return json;
    }

    @Override
    protected void onPostExecute(JSONObject json) {
        super.onPostExecute(json);

        int success = 0;
        JSONObject jData;
        JSONArray jObj = null;

        try{
            // successfully received details
            jObj = json.getJSONArray("details"); // JSON Array
            success = json.getInt("success");
        }catch(Exception e){
            e.printStackTrace();
        }

        if(success == 1){

            try{
                for( int i = 0; i < jObj.length(); i++ ){
                    //GET OBJECT FROM JSON Array
                    jData = jObj.getJSONObject(i);
                    //ASSIGN VALUES
                    msgId.add(jData.getInt("msg_id"));
                    memAvatar.add(jData.getString("mem_avatar"));
                    memName.add(jData.getString("mem_name"));
                    memId.add(jData.getInt("mem_id"));
                    msgBody.add(jData.getString("msg_body"));
                    msgTime.add(jData.getString("msg_time"));
                }
            }catch(Exception e){
                Log.e("STREAM FILE PROBLEM", e.getMessage());
            }

        }
            progressBar.dismiss();
            Log.e("STREAM FILE PROBLEM",""+memId.size());//prints 1 
    }

}
 }
4

1 に答える 1

1

AsyncTask を開始した直後に ArrayList を読み込もうとしていますが、結果は最後まで利用できませんdoInBackground
タスクが正常に実行されたことを確認するには、onPostExecute で必要なことを行う必要があります。
編集:
以下のようなリスナーを定義します。

    public interface RequestListener {
        public void onComplete(T response);
    }

InboxLoader にフィールド requestListener を追加します。

InboxLoader(Context context,int id, RequestListener li){
    this.ctx = context;
    this.msgBody   = new ArrayList<String>();
    this.memAvatar = new ArrayList<String>();
    this.memId     = new ArrayList<Integer>();
    this.memName   = new ArrayList<String>();
    this.msgTime   = new ArrayList<String>();
    this.msgId     = new ArrayList<Integer>();
    this.requestListener     = li;

    new LoadStream().execute(id);

}

onPostExecute でこれを追加します。

protected void onPostExecute(JSONObject json) {
        super.onPostExecute(json);

        int success = 0;
        JSONObject jData;
        JSONArray jObj = null;

        try{
            // successfully received details
            jObj = json.getJSONArray("details"); // JSON Array
            success = json.getInt("success");
            if(requestListener!=null)
                requestListener.onComplete();
        }catch(Exception e){
            e.printStackTrace();
        }

次に、クラス B の onComplete define で結果を処理できます。

    inStream = new InboxLoader(MainInbox.this,1, new RequestListener() {
        public void onComplete(){
            Log.e("JJJ",""+inStream.getMemId().size());
        };
    });
于 2013-06-07T01:28:32.720 に答える