2016-12-10 1 views
0

基本的に私のアンドロイドアプリでは世界中の都市を検索したいので、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 

}私は1つが最初に、次いで、コールバックが実行取得される外部onResponseからメッセージログに参照

。それはかなり理解可能ですが、私はこの応答を実行した後にArrayListを取得するためのトリックが欲しいです。

答えて

1

これは非同期操作の性質であり、作成した順序で完了しません。 allCitiesデータは、まだ実行する機会がないため、onCreateメソッドでは利用できません。 onResponseの外でそれを使用するトリックは、応答に依存するコードを独自のメソッドに移動することです。

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

、あなたはallCities移入した後、その後onResponseで、updateUI(またはものは何でもあなたはそれを呼び出す)を呼び出す -

@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

素晴らしいが...それは...感謝トンに動作します。 –

関連する問題