2013-06-07 3 views
1

У меня возникли проблемы с доступом к arraylists, заполненным этим asynctask из файла класса A. Из класса файла B я попробовать использовать такой метод, какAsynctask wint update array

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

метод из другого файла класса я получаю сбой в LogCat говоря indexoutofbounds error Я искал альтернативу, имеющие этот AsyncTask в том же файл как класс B открытый класс InboxLoader { Контекст ctx; ArrayListmemName, memAvatar, msgBody, msgTime; ArrayList msgId, memId;

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 
    } 

} 
} 

ответ

1

Вы пытаетесь прочитать ArrayList сразу после запуска AsyncTask, а результат не будет доступен, пока doInBackground концов.
Вы должны сделать то, что хотите, в onPostExecute, чтобы убедиться, что задача выполнена правильно.
Отредактировано:
Определение слушателя, как показано ниже:

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

и добавить поле requestListener в InboxLoader:

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(); 
     } 

Затем вы можете обработать результат в onComplete define в ваш класс B:

inStream = new InboxLoader(MainInbox.this,1, new RequestListener() { 
     public void onComplete(){ 
      Log.e("JJJ",""+inStream.getMemId().size()); 
     }; 
    }); 
+0

Ohhhhhh, я вижу. Адаптер находится в файле B, но как я могу уведомить его о том, что асинтеза из A выполнена? – kabuto178

+0

Не уверен, что должно быть указано в определении 'RequestListener' – kabuto178