2016-01-07 2 views
0

Это действительно странная проблема, которая у меня есть.Наблюдаемый RX-Retrofit получает данные только в первый раз

Я использую RX JAVA Наблюдаемый с модификацией для получения данных с сервера, эти данные должны меняться каждый раз, но, похоже, они загружают данные только в первый раз, а остальные - время повторного получения одинаковых данных ,

Кроме того, INTERNET CONNECTION по-прежнему получает данные (по-видимому, из локальных) и все еще идет в onNext, а не onError, как должно быть.

Это мой наблюдаемое:

Token token = new Token(AppConfig.TOKEN_NEWS); 
    Observable<ArrayList<NewsV0>> newsList = mZappAppApis.getNews(token.getToken()); 
    newsList 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Subscriber<ArrayList<NewsV0>>() { 
       @Override 
       public void onCompleted() { 
        Logger.i("Retriving user data onCompleted"); 
        onLoadCompleted(false); 
       } 

       @Override 
       public void onError(Throwable e) { 

        Logger.e("Error retriving user data [" + e.getMessage() + "]"); 
        onLoadCompleted(true); 
       } 

       @Override 
       public void onNext(ArrayList<NewsV0> newsV0s) { 
        Logger.i("Get news from api size ["+newsV0s.size()+"]"); 


        //Every time go here, with internet and without internet, loading the same data 
       } 
      }); 

Моего Модифицированная апи:

@GET("/News") 
Observable<ArrayList<NewsV0>> getNews(
     @Header("Authorization") String authorization 
); 

Я надеюсь, что кто-то может мне помочь!

Спасибо заранее!

EDIT:

Это путь я предоставления RetrofitAdapter

@Provides 
ZappAppApis provideContentApi(OkHttpClient okHttpClient) { 
    String apiUrl; 

    apiUrl = AppConfig.protocolHttp + AppConfig.ZAPPAPP_API_BASE_URL; 

    Logger.d("Base url API [ " + apiUrl + " ]"); 

    Retrofit restAdapter = new Retrofit.Builder() 
      .client(okHttpClient) 
      .baseUrl(apiUrl) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
      .build(); 

    return restAdapter.create(ZappAppApis.class); 
} 

И это путь, я предоставление OkHttpClient:

@Provides 
OkHttpClient okHttpClient() { 
    final OkHttpClient client = new OkHttpClient(); 

    HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); 

    if (BuildConfig.DEBUG) 
     loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
    else 
     loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.NONE); 

    // set disk cache 
    client.setCache(new Cache(context.getCacheDir(), DISK_CACHE_SIZE)); 

    List<Interceptor> interceptors = new ArrayList<>(); 
    interceptors.add(loggingInterceptor); 
    interceptors.add(new LoggingInterceptor() { 
     @Override 
     public Response intercept(Chain chain) throws IOException { 
      Request original = chain.request(); 

      Request request = original.newBuilder() 
        .header("Key", AppConfig.ZAPPAPP_CLIENT_KEY) 
        .header("Cache-Control", "public, max-age=60") 
        .method(original.method(), original.body()) 
        .build(); 

      return chain.proceed(request); 
     } 
    }); 

    client.networkInterceptors().addAll(interceptors); 

    return client; 
} 
+0

Вы выполняете кеширование HTTP? Отправьте код, который вы используете для создания RestAdapter, и создайте экземпляр вашего клиента API. – Egor

+0

Да, есть кеширование, но я не думаю, что проблема в том, что .. спасибо за помощь (отредактировано) – dvdciri

+0

client.setCache (новый Cache (context.getCacheDir(), DISK_CACHE_SIZE)); Вы кешируете свои результаты. – skywall

ответ

0

данные в автономном режиме поступает из кеша HTTP.

Здесь вы создаете кэш:

// set disk cache 
client.setCache(new Cache(context.getCacheDir(), DISK_CACHE_SIZE)); 

и здесь вы добавляете заголовок кэширования каждого запроса:

interceptors.add(new LoggingInterceptor() { 
    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Request original = chain.request(); 

     Request request = original.newBuilder() 
       .header("Key", AppConfig.ZAPPAPP_CLIENT_KEY) 
       .header("Cache-Control", "public, max-age=60") 
       .method(original.method(), original.body()) 
       .build(); 

     return chain.proceed(request); 
    } 
}); 

Вы можете удалить .header("Cache-Control", "public, max-age=60") если кэширование не приходит от сервера , Если кеширование происходит с сервера, вы можете использовать .header("Cache-Control", "max-stale=0"), и он должен избавиться от кэширования.

+0

Спасибо, это работает! Можете ли вы объяснить мне, как обращаться с кешем на клиенте? – dvdciri

Смежные вопросы