【问题标题】:How can I use the Retrofit response outside the OnResponse function?如何在 OnResponse 函数之外使用 Retrofit 响应?
【发布时间】:2017-05-18 08:33:41
【问题描述】:

我想获取改造响应列表并在 OnResponse 函数之外使用它,但我尝试这样做时总是得到一个空对象。 这是我的源代码

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

【问题讨论】:

  • 在 onResponse 中做你想做的事,否则你每次都会得到NullPointException,因为CallbackAsynchrone,所以当请求结束时会调用onResponse
  • onResponse 中存储数据后尝试检查列表的大小我认为数据没有存储在列表中。
  • @RaphaelTeyssandier 所以我知道我的结果不可能在 OnResponse 函数之外得到??
  • 您可能在改造 onResponse() 调用执行之前访问“列表”。尝试使用观察者。这样您就可以随时随地通知它。
  • @Anmol 列表的大小不为空,我已经检查了列表的内容并且它包含数据

标签: android retrofit


【解决方案1】:

请求是异步的,因此当您尝试返回值时,请求可能尚未完成,因此您无法在请求之外使用它。如果要从请求中返回值,请使用回调接口。

将代码更改为方法并传递回调参数

例子

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

onResume() 中的用法示例,基本上你可以在任何你想要的地方执行此操作:

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

如果这符合您的需求,请告诉我

【讨论】:

  • 谢谢你的回答我会试一试
【解决方案2】:

因为 onResponse() 是异步运行的。你不能这样获得它的价值。
您应该在 onResponse() 中调用使用list 值的方法。 例如。

 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
  }

【讨论】:

  • 很高兴它有帮助。如果它对您有用,请接受答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 1970-01-01
  • 2017-06-15
  • 2020-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多