helloはredditサービスからやっているGET要求をキャッシュしようとしています。私は別のAPIを使ってテストしても動作しますが、なぜ私がこのキャッシュのキャッシュを制御できないのかわかりません。私はキャッシュデータがアプリの設定でどのようにアップするのかを見ることができます。私は、インターネット接続(機内モード)をオフにしたときにしかし、私はこのエラーを取得:私はhttps://itunes.apple.com/us/rss/topfreeapplications/limit=20/jsonサービスとキャッシュを試みたモトG 4プラスAPI 23上HTTPが失敗しました:java.net.UnknownHostException:ホスト "www.reddit.com"を解決できません:ホスト名に関連付けられたアドレスがありません
01-17 06:00:05.524 17363-17429/com.amirgb.reddittestapp.debug D/OkHttp: --> GET https://www.reddit.com/reddits.json http/1.1 01-17 06:00:05.524 17363-17429/com.amirgb.reddittestapp.debug D/OkHttp: --> END GET 01-17 06:00:05.531 17363-17429/com.amirgb.reddittestapp.debug D/OkHttp: <-- HTTP FAILED: java.net.UnknownHostException: Unable to resolve host "www.reddit.com": No address associated with hostname
イム・テストは、作業を行うので、多分に差がありますredditヘッダ? 。
マイrestclientクラス:
public static boolean isNetworkAvailable(Context context) {
ConnectivityManager cm =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
return activeNetwork != null &&
activeNetwork.isConnectedOrConnecting();
}
マイレトロフィット・インターフェース:
public interface IRedditApi {
String BASE_URL = "https://www.reddit.com";
@GET("/reddits.json")
Call<RedditResponse> getSubjects();}
のRedditのREPONSEヘッダー:
方法utilのaccept-ranges →bytes access-control-allow-origin →* access-control-expose-headers →X-Reddit-Tracking, X-Moose cache-control →max-age=0, must-revalidate content-encoding →gzip content-length →79113 content-type →application/json; charset=UTF-8 date →Tue, 17 Jan 2017 09:16:52 GMT status →200 strict-transport-security →max-age=15552000; includeSubDomains; preload vary →accept-encoding via →1.1 varnish x-cache →MISS x-cache-hits →0 x-content-type-options →nosniff x-frame-options →SAMEORIGIN x-moose →majestic x-reddit-tracking → https://pixel.redditmedia.com/pixel/of_destiny.png?v=W9eORuZE%2BzXXBRZc%2BikbQ8aTR0a7BSLeoE9DDYvuCihjMAifTK%2Bdsr%2F0gX8rDES98kR5xK2vVWc%3D x-served-by →cache-dfw1841-DFW x-timer →S1484644612.225905,VS0,VE254 x-ua-compatible →IE=edge x-xss-protection →1; mode=block
import android.content.Context;
import android.widget.ImageView;
import com.amirgb.reddittestapp.BuildConfig;
import com.amirgb.reddittestapp.R;
import com.amirgb.reddittestapp.RedditTestApplication;
import com.amirgb.reddittestapp.model.RedditResponse;
import com.amirgb.reddittestapp.util.NetWorkUtils;
import java.io.File;
import java.util.concurrent.TimeUnit;
import okhttp3.Cache;
import okhttp3.CacheControl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public final class RedditApiService {
private static IRedditApi mRedditApi;
private static OkHttpClient mClient;
/**
* Inits retrofit
*/
static {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
File httpCacheDirectory = new File(RedditTestApplication.getInstance().getCacheDir(), "reddit");
Cache cache = new Cache(httpCacheDirectory, 10 * 1024 * 1024);
mClient = new OkHttpClient.Builder()
.cache(cache)
.addInterceptor(chain -> {
Request request = chain.request();
if (NetWorkUtils.isNetworkAvailable(RedditTestApplication.getInstance())) {
request = request.newBuilder()
.cacheControl(new CacheControl.Builder()
.maxAge(0, TimeUnit.SECONDS)
.maxStale(365, TimeUnit.DAYS).build())
.build();
}
Response originalResponse = chain.proceed(request);
if (NetWorkUtils.isNetworkAvailable(RedditTestApplication.getInstance())) {
int maxAge = 60 * 60;
return originalResponse.newBuilder()
.header("Cache-Control", "public, max-age=" + maxAge)
.build();
} else {
int maxStale = 60 * 60 * 24 * 28;
return originalResponse.newBuilder()
.header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
.build();
}
})
.connectTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.addInterceptor(interceptor)
.build();
Retrofit mRetrofit = new Retrofit.Builder()
.baseUrl(IRedditApi.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(mClient)
.build();
mRedditApi = mRetrofit.create(IRedditApi.class);
}
/**
* Get subjects from service api
*
* @param callback
*/
public static void getSubjects(Callback<RedditResponse> callback) {
Call<RedditResponse> call = mRedditApi.getSubjects();
call.enqueue(callback);
}
マイネットワーク
私は既にキャッシュしている場合、オフライン接続でデータを取得したいです。私はキャッシュを使用したいユーザーが接続を失った場合、私はそれがオンラインになるアプリを実行する最初。 – AmirG
は、 "must-revalidate"をHTTPキャッシュヘッダーとして読み上げます。 Redditは、情報が同じであるかどうかを確認するためにヘッドリクエストを送信することなく、このデータを使用することを望んでいません。何も変更されていなければ、本体なしで304応答が得られ、キャッシュを使用することができます。 通常、必要な情報をアプリに直接保存するだけです。 要求を傍受してそのヘッダを手動で削除することは可能かもしれませんが、それはどうすればいいのですか? – user1625744
ありがとう!私はsharepreferencesまたは私がjsonを解析することができるようなもののようなものを保存するために行くだろうと思う。良い一日を持ってください:) – AmirG