Caroline
Caroline

Reputation: 71

How can I use the Retrofit response outside the OnResponse function?

I want to get the retrofit response list and use it outside the OnResponse function, but went I try to do it I'm always getting a null object. Here is my source code

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

Upvotes: 2

Views: 2890

Answers (2)

Denny
Denny

Reputation: 1783

Requests are async, so when you try to return a value, the request is likely not done yet so you cannot use it outside of the request. If you want to return values from the request use callback interfaces.

Change your code to a method and pass a callback parameter

Example

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

Example usage in onResume(), basically you can do this anywhere you want:

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

Let me know if this fits your needs

Upvotes: 5

Quang Nguyen
Quang Nguyen

Reputation: 2660

Because onResponse() runs asynchronously. You can not get its value like that.
You should call the method which uses list value inside onResponse(). For example.

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

        }
    });

  private void yourMethod() {
     //  list is used somewhere here
  }

Upvotes: 0

Related Questions