使用RxJava保存Retrofit2 API调用缓存

时间:2016-10-25 13:16:11

标签: android rx-java retrofit2

我是rxJava和Retrofit2的新手,但我似乎无法弄清楚如何实现理想的情况:

  1. 获取地方列表(Retrofit2 API接口)这将为JSON数组提供地点对象
  2. 将JSON数组放在HashMap中(在哪里处理?)
  3. 将HashMap放入Singleton中,以便缓存,并可以使用getInstance在整个应用程序中调用
  4. JSON数组包含数百个'我希望缓存(Singleton),所以我不必为应用程序中的每个更改调用。

    接口(myAPI)

        /**
         * RxJava testing endpoint
         * @return Observable list of Places
         * count = 0 means everything
         */
        @GET("place/search?count=0")
        rx.Observable<List<Place>> loadPlacesRx();
    

    的Singleton

    ...
    private static PlaceSingleton ourInstance = new PlaceSingleton();
        private static RxJavaCallAdapterFactory rxAdapter =
                RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io());
    
        private static Retrofit retrofit = new Retrofit.Builder()
                .addConverterFactory(JacksonConverterFactory.create())
                .addCallAdapterFactory(rxAdapter)
                .baseUrl(myAPI.BASE_URL)
                .build();
    
        // Prepare call in Retrofit2
        private static MyAPI myAPI = retrofit.create(MyAPI.class);
    
        /**
         * This method should handle the steps mentioned above
         */
        public void getAllPlaces() {
    
        poiList = myAPI.loadPlacesRx()
        .map(Place -> ...
    ...
    

1 个答案:

答案 0 :(得分:0)

您可以使用Gson将自己的缓存序列化对象保存到字符串中,并将其保存到共享首选项。

使用Gson: 序列化:

new Gson().toJson(yourObject);

并且反序列化:

new Gson().fromJson(stringObject);

使用Jakson:

要序列化:

ObjectMapper mapper = new ObjectMapper();
String objectString = mapper.writeValueAsString(object);

要反序列化:

ObjectMapper mapper = new ObjectMapper();
Object object = mapper.readValue(jsonInString, Object.class);