【问题标题】:How can I return data in method from Retrofit onResponse?如何从 Retrofit onResponse 方法中返回数据?
【发布时间】:2017-07-26 22:47:48
【问题描述】:

我是改造新手,我想让我的 getData 方法返回一个特征对象。最简单的方法是什么?

DataService.java

public class DataService {

    private static final String TAG = MainActivity.class.getSimpleName();
    private final ApiClient apiClient;

    public DataService() {
        apiClient = new ApiClientFactory().createApiClient();
    }

    public List<Feature> getData(){

        apiClient.getData().enqueue(new Callback<DataResponse>() {

            @Override
            public void onResponse(Call<DataResponse> call, Response<DataResponse> response) {
                List<Feature> features = response.body().getFeatures();
                Log.d(TAG, "Data successfully downloaded");
            }

            @Override
            public void onFailure(Call<DataResponse> call, Throwable t) {
                Log.e(TAG, t.toString());
            }
        });
        //I need to return features in getData method
    }
}

【问题讨论】:

标签: java android retrofit2


【解决方案1】:

你不能return,你必须“回电”。

将该内部回调类提取到一个参数。

public void getData(Callback<DataResponse> callback){
    apiClient.getData().enqueue(callback);
}

在你的其他代码中

// DataService service = ...;

// Define Callback
Callback<DataResponse> responseCallback = new Callback<DataResponse>() {

    @Override
    public void onResponse(Call<DataResponse> call, Response<DataResponse> response) {
        List<Feature> features = response.body().getFeatures();
        Log.d(TAG, "Data successfully downloaded");

        // Data is returned here
        for (Feature f: features) {
            Log.d("feature", String.valueOf(f)); // for example
        }
    }

    @Override
    public void onFailure(Call<DataResponse> call, Throwable t) {
        Log.e(TAG, t.toString());
    }
};

// Call it
service.getData(responseCallback);

你也可以service.getData(new Callback&lt;DataResponse&gt;() { ... });

【讨论】:

  • 好吧,我基本明白了,但是如何在同一个类中创建DataService的Instance,或者在DataService之外的其他类中调用responseCallback并传递给getData方法呢?
  • responseCallback 是一个独立变量,您可以在任何需要实际数据的地方定义它。至于DataService...你应该已经在一些活动或片段中拥有它。
  • 好的,这很明显 :) 但我还有一个问题 - 如何从 getData 方法中提取下载的数据(特征)?
  • 看我的回答。 getData() 无效。你什么也不做,只是打电话给它。你想得到的一切都可以从你已经得到你的问题的List&lt;Feature&gt; features 中完成。
  • 好的,谢谢 :) 我有点困惑,但我现在明白了 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多