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 に答える