2016-10-25 5 views
1

Я новичок в rxJava и Retrofit2, но я не могу показаться, чтобы выяснить, как достичь желаемой ситуации:Сохранить Retrofit2 API вызова кэшировать с RxJava

  1. Получить список мест (Retrofit2 интерфейса API), это будет дать JSON массив с местом объекты
  2. Put JSON массив в HashMap (где справиться с этим?)
  3. Put HashMap в Singleton, так что это кэшируются и может быть вызвана по всему приложению с GetInstance

Массив 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 -> ... 
... 
+0

Функция 'map' добавляет каждое место в ваш' PlaceSingleton', содержащий хэш-карту. Вместо оператора 'map' вы можете использовать' doOnNext' –

ответ

0

Вы можете сохранить в свой собственный кэш serializating объекта в строку, используя Gson и сохранить его в общих настройках.

Использование Gson: Для serializate:

new Gson().toJson(yourObject); 

И deserializate:

new Gson().fromJson(stringObject); 

Использование Яксон:

Для serializate:

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

К десериализату:

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

Что делать, если я использую Джексон, который является обязательным? – Lobato

+0

Я обновил свой ответ –

+0

Как обрабатывать наблюдаемый список и как насчет хэш-карты? – Lobato