【问题标题】:Observable RX- Retrofit get data only first timeObservable RX - Retrofit 仅第一次获取数据
【发布时间】:2016-04-12 12:30:16
【问题描述】:

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

我正在使用带有改造功能的 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;
}

【问题讨论】:

  • 你在做任何 HTTP 缓存吗?请发布您用于创建 RestAdapter 并实例化您的 API 客户端的代码。
  • 是的,有一些缓存,但我认为问题不在于.. 感谢您的帮助(已编辑)
  • client.setCache(new Cache(context.getCacheDir(), DISK_CACHE_SIZE));您正在缓存结果。
  • 我已经尝试删除此行,但似乎仍然无法正常工作。如果您有任何其他想法,我会在晚上重新尝试以再次检查。谢谢

标签: android retrofit rx-java observable retrofit2


【解决方案1】:

离线时的数据来自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"),它应该摆脱缓存。

【讨论】:

  • 谢谢,它有效!你能解释一下如何处理客户端上的缓存吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
相关资源
最近更新 更多