【问题标题】:How to get different objects with Retrofit Android如何使用 Retrofit Android 获取不同的对象
【发布时间】:2016-02-22 21:17:15
【问题描述】:

我在 Android Studio 中使用 Retrofit 1.9.0 从我的 REST API 获取响应。

我想做的方法是 GET,在这个 URL 上:http://dotfreeride.com/api/rest/adventures.php

我成功检索到另一个 API 的响应,但它只有 1 个对象,这有 3 个大对象。

我的 IApiMethods 界面是这样的:

@GET("/adventures.php")
JSONObject getAdventures(
      Callback<AdventuresApi> cb
);

我的 AdventuresApi(模型类)是这样的:

public class AdventuresApi {
    public String adventure_id;
    public String trimaps_context;
    public String name;
    public String video_url;

    public List<ArrayPoi> array_poi;

    public class ArrayPoi {
        String poi_id;
        String name;
        String lat;
        String lng;
        String video_url;
    }
}

我在 Activity 中的 Retrofit 调用是这样的:

RestAdapter restAdapter = new RestAdapter.Builder()
            .setEndpoint(API_URL)
            .build();
    IApiMethods methods = restAdapter.create(IApiMethods.class);
    Callback callback = new Callback() {
        @Override
        public void success(Object o, Response response) {

        }

        @Override
        public void failure(RetrofitError error) {
            Log.e("JSON", "NO DATA!");
        }
    };
    methods.getAdventures(callback);

我真的不知道如何获取对象,我想获取对象的名称(例如:trimaps_context 是“动词”,我需要名称“Powder Hound”)

对于单个对象,我在onResponse(Object o, Response response) 中成功地做到了这一点:

(ProfileApi) profileData = (ProfileApi) o;
Log.e("JSON", profileData.name + " " + profileData.email);

【问题讨论】:

    标签: android json retrofit okhttp


    【解决方案1】:

    1) 您正在尝试结合同步和异步调用。如果你想异步执行一个请求,你必须像这样定义它:

    @GET("/adventures.php")
    void getAdventures(
            Callback<List<AdventuresApi>> cb
    );
    

    2) 不要在每次调用请求时创建RestAdapter 实例。真是重量级的操作。使用singleton pattern。然后您可以简单地调用:

    ApiManager.getAdapter().getAdventures(...);
    

    3) 对象映射由参数化的Callback 类提供:

    ApiManager.getAdapter().getAdventures(
        new Callback<List<AdventuresApi>>() {
            @Override
            public void success(List<AdventuresApi> adventures, Response response) {
                // here you can access the adventures list
            }
    
            @Override
            public void failure(RetrofitError error) {
                // handle error
            }
        });
    

    【讨论】:

      猜你喜欢
      • 2020-07-17
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 2014-01-04
      • 2017-09-15
      相关资源
      最近更新 更多