0

这是我遇到的一个非常奇怪的问题。

我正在使用带有改造功能的 RX JAVA Observable 从服务器获取数据,这类数据每次都应该更改,但似乎只在第一次加载数据,其余时间重新获取相同的数据。

同样没有 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
                }
            });

我的改造 api:

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

我希望有人能帮助我!

提前致谢!!

编辑:

这就是我提供 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;
}
4

1 回答 1

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")它,它应该摆脱缓存。

于 2016-01-08T09:19:38.350 回答