12

こんにちは私はAndroid4で導入されたHttpResponseCacheを使用しようとしています。ドキュメントはキャッシュのインストール方法について明確に説明していますが、ネットからダウンロードした画像をキャッシュする方法については完全に途方に暮れています。以前はDiskLruCacheを使用してそれらをキャッシュしていました。 。HttpResponseCacheが使用されている動作コードの例を誰かに教えてもらえますか。

編集:-誰かが私がここで間違っていることを教えてもらえますか:-

MainActivity.java
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
    final File httpCacheDir = new File(getCacheDir(), "http");
    try {
        Class.forName("android.net.http.HttpResponseCache")
            .getMethod("install", File.class, long.class)
            .invoke(null, httpCacheDir, httpCacheSize);
        Log.v(TAG,"cache set up");
    } catch (Exception httpResponseCacheNotAvailable) {
        Log.v(TAG, "android.net.http.HttpResponseCache not available, probably because we're running on a pre-ICS version of Android. Using com.integralblue.httpresponsecache.HttpHttpResponseCache.");
        try{
            com.integralblue.httpresponsecache.HttpResponseCache.install(httpCacheDir, httpCacheSize);
        }catch(Exception e){
            Log.v(TAG, "Failed to set up com.integralblue.httpresponsecache.HttpResponseCache");
        }
    }
    TheMainListFrag gf=(TheMainListFrag) getSupportFragmentManager().findFragmentByTag("thelistfrags");
    if(gf==null){
        gf=TheMainListFrag.newInstance();
        FragmentTransaction ft=getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.thelefty, gf,"thelistfrags");
        ft.commit();
    }
}

次に、TheMainListFragのローダーで、次のようにします。-

public ArrayList<HashMap<String,String>> loadInBackground() {
    String datafromServer = null;
    ArrayList<HashMap<String,String>> al = new ArrayList<HashMap<String,String>>();
    try {
        String url = "someurl";
        HttpURLConnection urlConnection = (HttpURLConnection) new URL(url).openConnection();

        urlConnection.setRequestProperty("Accept", "application/json");
        InputStream is = new BufferedInputStream(urlConnection.getInputStream());
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }
        datafromServer=sb.toString();
        Log.v("fromthread",datafromServer);
        // etc 
                    //etc

    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (Exception e) {
        Log.v("fromthread", e.getClass() + "--" + e.getMessage());
    }

    return al;
}

インターネットに接続しているときは正常に動作し、ディレクトリhttp(上記の名前のキャッシュディレクトリ)では、ファイルも表示されます。しかし、私がインターネットに接続していないとき、データはロードを拒否します。

ネットからイメージをロードすると、.tmpという名前のキャッシュファイルが表示されます。これは、DiskLruCacheに従ってダーティと呼ばれていると思います。

他に提供してほしい情報があれば教えてください

4

3 に答える 3

11

HttpResponseCacheドキュメントの「キャッシュ応答を強制する」セクションから:

リソースがすぐに利用できる場合は表示したい場合がありますが、そうでない場合は表示しません。これを使用すると、最新のデータがダウンロードされるのを待っている間にアプリケーションが何かを表示できるようになります。ローカルにキャッシュされたリソースへのリクエストを制限するには、 only-if-cachedディレクティブを追加します。

try {
    connection.addRequestProperty("Cache-Control", "only-if-cached");
    InputStream cached = connection.getInputStream();
    // the resource was cached! show it
} catch (FileNotFoundException e) {
    // the resource was not cached
}

この手法は、応答が古い場合の方が応答がない場合よりも優れている場合に、さらに効果的に機能します。失効したキャッシュ応答を許可するには、失効 max-staleが最大の秒単位のディレクティブを使用します。

int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale
connection.addRequestProperty("Cache-Control", "max-stale=" + maxStale);
于 2012-07-30T00:12:25.993 に答える
1

を有効にするHttpResponseCacheと、すべてのHttpUrlConnectionクエリがキャッシュされます。任意のデータをキャッシュするために使用することはできないので、引き続き使用DiskLruCacheすることをお勧めします。

于 2012-07-20T18:21:30.433 に答える
1

私の場合、HttpResponseCacheは実際には何もキャッシュしていませんでした。それを修正したのは単純です:

connection.setUseCaches(true);

(これは、HttpURLConnection接続を確立する前に呼び出す必要があります。)

よりきめ細かい制御のために、ジェシーウィルソンが指摘したmax-staleように使用することができます。

于 2013-10-31T16:52:34.740 に答える