2016-04-22 2 views
0

У меня есть классы в моих проектах, которые выполняют только операции с сервером, такие как получение и отправка данных. У меня есть класс, который заполняет список, а затем метод, чтобы получить этот список. проблема в том, что я вызываю метод getList и завершение операции hasent, после чего я получаю null от метода getListизвлекает arraylist из объекта класса AsyncTask после завершения метода doInBackground

это мой класс AsyncTask, так как вы можете видеть, что «getList» предполагает дать мне список завершен

public class GetRoomatesListActivity extends AsyncTask<String, String, String> { 
    private ArrayList<RoomateModel> tmpList; 
    private ArrayList<RoomateModel> completeList; 
    DBHelper db; 
    Context context; 

    public GetRoomatesListActivity(Context context){ 
     this.context = context; 
    } 

    @Override 
    protected String doInBackground(String... params) { 

     db = DBHelper.getInstance(context); 
     HttpURLConnection connection = null; 
     BufferedReader reader = null; 
     tmpList = new ArrayList<RoomateModel>(); 
     try { 
      URL url = new URL(params[0]); 
      connection = (HttpURLConnection) url.openConnection(); 
      connection.connect(); 

      InputStream stream = connection.getInputStream(); 

      reader = new BufferedReader(new InputStreamReader(stream)); 
      StringBuffer buffer = new StringBuffer(); 

      String line = ""; 

      while ((line = reader.readLine()) != null) { 
       buffer.append(line); 

      } 
      String finalJson = buffer.toString(); 
      JSONObject parentObject = new JSONObject(finalJson); 
      JSONArray parentArray = parentObject.getJSONArray("result");//creates array of Roomates of the selected apartment 


      for (int i = 0; i < parentArray.length(); i++) { 
       JSONObject finalObject = parentArray.getJSONObject(i);//get the cuttent json object which is representaion of roomate object 

       String Fname = finalObject.getString("firstName"); 
       String Lname = finalObject.getString("lastName"); 
       String phone = finalObject.getString("phone"); 

       RoomateModel item = new RoomateModel(Fname, Lname, phone);//creates roomates model with the current item data from the array 
       tmpList.add(item);//adds the roomate to the list of roomates 

       //add the roomates to local data base 

       db.addRoomate(item,apartment); 
      } 

      return null; 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } finally { 
      if (connection != null) { 
       connection.disconnect(); 
      } 
      try { 
       if (reader != null) { 
        reader.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 
     completeList = tmpList; 

    } 
    public ArrayList<RoomateModel> getList(){ 
     return completeList; 
    } 

} 

и это класс, который им пытаются получить список для того, чтобы использовать его, но его извлечения нуль

public class roomatesScreen extends Activity { 
    ListView items; 
    ArrayList<RoomateModel> list; //list to compare with the list rerived from GetRoomatesListActivity 
    RoomatesAdapter adapter; 
    DBHelper db; 
    ApartmentModel apartment; 
    SharedPreferences preferences; 
    GetRoomatesListActivity r; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.roomates_list); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    items = (ListView) findViewById(R.id.roomatesList); 
    db = DBHelper.getInstance(this); 

    Bundle bundle = getIntent().getExtras(); 
    int number = bundle.getInt("number"); 
    apartment = new ApartmentModel(number);// creates apartment model with the user's apartment number 
    final String num = Integer.toString(number); 
    r = new GetRoomatesListActivity(this); 
    r.execute("this is the link to my query" + num); 
    list = r.getList(); //here list is null 
    adapter = new RoomatesAdapter(roomatesScreen.this, list); 
    items.setAdapter(adapter);//here application crushes because of nullPointerExpeption 

ответ

2

лучший способ для выполнения обновления на пользовательском интерфейсе находится в методе PostExecute AsyncTask .. В то время, когда вы обращаетесь к нему, элемент управления находится в методе doInBackground. Таким образом, ваш список в этот момент равен нулю. поставить этот

@Override 
protected void onPostExecute(String s) { 
    super.onPostExecute(s); 

    adapter = new RoomatesAdapter(roomatesScreen.this, tmpList); 
    items.setAdapter(adapter);/ 

} 

в onPostExecute().

второе решение

Инициализировать список, когда вы устанавливаете его к адаптеру. как:

list = new ArrayList(); 

и остальные работы (обновить список и вызвать notifyDataSetChanged() на адаптере объекта) в onPostExecute().

+0

адаптер и список пунктов определяются в классе «RoomatesScreen», если я хотел бы сделать «getRoomatesListActivity» внутренний класс внутри " RoomatesScreen "класс будет работать. но я не хочу – ATT

+0

, в этом случае вы можете создать конструктор своей AsyncTask и передать контекст и другую информацию для обновления адаптера, чтобы обновить список. –

0

Изменение doInBackground() возвращает метод типа

public class GetRoomatesListActivity extends AsyncTask<String, String, ArrayList<Object>> { 
private ArrayList<RoomateModel> tmpList; 
private ArrayList<RoomateModel> completeList; 
DBHelper db; 
Context context; 

public GetRoomatesListActivity(Context context){ 
    this.context = context; 
} 

@Override 
protected ArrayList<Object> doInBackground(String... params) { 

    db = DBHelper.getInstance(context); 
    HttpURLConnection connection = null; 
    BufferedReader reader = null; 
    tmpList = new ArrayList<RoomateModel>(); 
    try { 
     URL url = new URL(params[0]); 
     connection = (HttpURLConnection) url.openConnection(); 
     connection.connect(); 

     InputStream stream = connection.getInputStream(); 

     reader = new BufferedReader(new InputStreamReader(stream)); 
     StringBuffer buffer = new StringBuffer(); 

     String line = ""; 

     while ((line = reader.readLine()) != null) { 
      buffer.append(line); 

     } 
     String finalJson = buffer.toString(); 
     JSONObject parentObject = new JSONObject(finalJson); 
     JSONArray parentArray = parentObject.getJSONArray("result");//creates array of Roomates of the selected apartment 


     for (int i = 0; i < parentArray.length(); i++) { 
      JSONObject finalObject = parentArray.getJSONObject(i);//get the cuttent json object which is representaion of roomate object 

      String Fname = finalObject.getString("firstName"); 
      String Lname = finalObject.getString("lastName"); 
      String phone = finalObject.getString("phone"); 

      RoomateModel item = new RoomateModel(Fname, Lname, phone);//creates roomates model with the current item data from the array 
      tmpList.add(item);//adds the roomate to the list of roomates 

      //add the roomates to local data base 

      db.addRoomate(item,apartment); 
     } 

     return null; 

    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } finally { 
     if (connection != null) { 
      connection.disconnect(); 
     } 
     try { 
      if (reader != null) { 
       reader.close(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    return null; 
} 

@Override 
protected void onPostExecute(String s) { 
    super.onPostExecute(s); 
    completeList = tmpList; 

} 
public ArrayList<RoomateModel> getList(){ 
    return completeList; 
} 

}

Смежные вопросы