2017-05-18 8 views
0

私は改造応答リストを取得し、それをOnResponse関数の外で使用したいが、私はそれをやろうと試みた。私はいつもnullオブジェクトを取得している。 onResponse()は非同期で実行されるため は、ここに私のソースコードOnResponse機能の外でRetrofitレスポンスを使用するにはどうすればよいですか?

ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class); 

    Call<ActivitiesResponse> call = apiService.getUserActivities(id); 
    call.enqueue(new Callback<ActivitiesResponse>() { 
     // If success 
     @Override 
     public void onResponse(Call<ActivitiesResponse>call, Response<ActivitiesResponse> response) { 

      list = response.body().getActivities();// I'm getting a not null response 

     } 
     // If failed 
     @Override 
     public void onFailure(Call<ActivitiesResponse>call, Throwable t) { 
      // Log error here since request failed 
      Log.e(TAG, t.toString()); 

     } 
    }); 

    //When I try to use the list here I'm getting a null object 
+0

あなたはonResponseで何をしたいのですか、 'Callback'が' Asynchrone'であるために 'NullPointException'が発生するので、' onResponse'はリクエストが終了したときに呼び出されます。 –

+0

'onResponse'にデータを格納した後に、リストのサイズをチェックしようとすると、データがリストに格納されていないと思います。 – Anmol

+0

@RaphaelTeyssandierしたがって、私の結果をOnResponse関数の外に出す可能性はないことを理解していますか? – Caroline

答えて

0

です。あなたはそのような価値を得ることはできません。
onResponse()内のlist値を使用するメソッドを呼び出す必要があります。 たとえば、

+0

OK、たくさんありがとう – Caroline

+0

うれしいです。それがあなたのために働くなら、答えを受け入れてください。ありがとう。 –

2

リクエストは非同期なので、リクエストを返そうとするとリクエストはまだ行われていない可能性があります。リクエスト以外でリクエストを使用することはできません。要求から値を返す場合は、コールバックインタフェースを使用します。

onResumeで

例に

public void doRequest(final ApiCallback callback) { 
    ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class); 

    Call<ActivitiesResponse> call = apiService.getUserActivities(id); 
    call.enqueue(new Callback<ActivitiesResponse>() { 
     // If success 
     @Override 
     public void onResponse(Call<ActivitiesResponse>call, Response<ActivitiesResponse> response) { 

      list = response.body().getActivities(); 
      callback.onSuccess(list); // pass the list 
     } 
     // If failed 
     @Override 
     public void onFailure(Call<ActivitiesResponse>call, Throwable t) { 
      // Log error here since request failed 
      Log.e(TAG, t.toString()); 
     } 
    }); 
} 

public interface ApiCallback{ 
    void onSuccess(ArrayList<YOURTYPE> result); 
} 

のメソッドにコードを変更し、コールバックパラメータを渡す

使用例()、基本的にあなたがしたい、このどこでも行うことができます。

public void onResume(){ 
    super.onResume(); 
    doRequest(new ApiCallback(){ 
     @Override 
     public void onSuccess(ArrayList<YOURTYPE> result){ 
      //do stuff here with the list from the request 
     } 
    }); 
} 

をこれがあなたのニーズに合っているかどうかを教えてください。

+0

あなたの答えをありがとう、私は試してみましょう – Caroline

関連する問題