2016-12-10 3 views
0

В основном в моем приложении для Android. Я хочу, чтобы пользователь просматривал города по всему миру, поэтому я использую api для получения всех городов мира и хранения в ArrayList, это был выполнен в методе okhttp onResponse, и после этого список становится пустым. Этот список массивов содержит значения только в onResponse, но я хочу использовать его во всем моем классе после выполнения. Может ли кто-нибудь дать мне какие-нибудь идеи по этому поводу? Вот код.сохранить данные, полученные в методе onResponse, доступного по всему классу

onCreate(){ 
OkHttpClient client = new OkHttpClient(); 
    final Request request = new Request.Builder() 
      .url("https://raw.githubusercontent.com/David-Haim/CountriesToCitiesJSON/master/countriesToCities.json") 
      .build(); 
    Call call = client.newCall(request); 
    call.enqueue(new Callback() { 
     @Override 
     public void onFailure(Request request, IOException e) { 

     } 

     @Override 
     public void onResponse(Response response) throws IOException { 
      try { 
       fullObject = new JSONObject(response.body().string()); 
       JSONArray s = fullObject.names(); 
       for(int i=0; i<s.length(); i++) { 
        JSONArray citiesOfOneCoutry = null; 
        citiesOfOneCoutry = fullObject.getJSONArray(s.getString(i)); 
        for(int j=0; j<citiesOfOneCoutry.length();j++) { 
         allCities.add(citiesOfOneCoutry.getString(j)); 
        } 
        Log.d(TAG, "onResponse: in for "+allCities.size()); 
       } 
       Log.d(TAG, "onResponse: outside for "+allCities.size()); //gives full size. 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      Log.d(TAG, "onResponse: outside try "+allCities.size()); //gives full size 
     } 
    }); 

    Log.d(TAG, "outside response inside oncreate"+allCities.size()); //gives 0 

}

Я вижу в журналах, что сообщение из-за пределов onResponse один является первым, а затем обратный вызов становится казнены. это вполне понятно, но я хочу, чтобы трюк получил ArrayList после выполнения ответа.

ответ

1

Это характер асинхронных операций, они не заполняются в том порядке, в котором вы их написали. allCities данные не будут доступны в вашем методе onCreate, потому что у него еще не было возможности выполнить его. Хитрость использования его за пределами onResponse заключается в перемещении кода, который зависит от ответа на свой собственный метод.

private void updateUI() { 
    // Your code that relies on 'allCities' 
} 

, а затем в onResponse, вызовите updateUI (или что вы его называете) после того, как вы заселить allCities -

@Override 
public void onResponse(Response response) throws IOException { 
    try { 
     fullObject = new JSONObject(response.body().string()); 
     JSONArray s = fullObject.names(); 
     for(int i=0; i<s.length(); i++) { 
      JSONArray citiesOfOneCoutry = null; 
      citiesOfOneCoutry = fullObject.getJSONArray(s.getString(i)); 
      for(int j=0; j<citiesOfOneCoutry.length();j++) { 
       allCities.add(citiesOfOneCoutry.getString(j)); 
      } 
      Log.d(TAG, "onResponse: in for "+allCities.size()); 
     } 
     Log.d(TAG, "onResponse: outside for "+allCities.size()); //gives full size. 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    Log.d(TAG, "onResponse: outside try "+allCities.size()); //gives full size 
    updateUI(); 
} 
+0

замечательные .. это работает .. спасибо за тонну. –

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