17

Volley が JsonObjectRequest の結果をキャッシュまたはネットワークから取得するかどうかを確認するにはどうすればよいですか?

ネットワーク接続が必要な場合は進行状況ダイアログを表示する必要がありますが、結果がキャッシュからすぐに受信された場合は表示されません。

私のリクエストは次のようになります

volleyQueue = Volley.newRequestQueue(this);
JsonObjectRequest jr = new JsonObjectRequest(Request.Method.POST, url, null, new Response.Listener<JSONObject>(){...stuff}, new Response.ErrorListener(){...errorstuff});
jr.setShouldCache(true);
volleyQueue.add(jr);
4

5 に答える 5

11

Request#addMarker をオーバーライドし、「キャッシュ ヒット」マーカーが追加されているかどうかを確認することで、これを行いました。

public class MyRequest<T> extends Request<T> {

    protected boolean cacheHit;

    @Override
    public void addMarker(String tag) {
        super.addMarker(tag);
        cacheHit = false;
        if (tag.equals("cache-hit")){
            cacheHit = true;
        }
    }
}
于 2014-01-09T01:11:06.220 に答える
4

リクエストを作成する前に、リクエスト キューからキャッシュを取得し、エントリが null でないかどうかを確認できます。

mRequestQueue.getCache().get("key");

通常、各リクエストのキーは URL です。エントリの有効期限も切れているかどうかを確認する必要があると思います。

于 2014-01-21T11:55:40.270 に答える
2

ティム・ケリーの答えから始めます。

「cacheHit」をチェックするまでに false に戻り、「cacheHit」が受信された後、「onResponse」が呼び出される前に他の多くのタグが受信されるため、キャッシュ ヒットであることがわかりません。

だから、追加

if(tag.equals("network-http-complete")){
            cacheHit = false;
        }

そして取り除くcacheHit = false;

于 2014-04-13T05:56:14.143 に答える
2

Volleyには、画像リクエストがクラスを介して即時に行われるかどうかを知る方法が組み込まれImageContainerていますが、JSONオブジェクトリクエストなどの他のリクエストに対して同様のメカニズムを持っていないようです.

主に 2 つの選択肢があるようです。

  1. JSON を要求した後、300 ミリ秒などのタイマーを設定できます (最適な時間をテストします)。タイマーが終了したら、すでに結果があるかどうかを確認し、そうでない場合はダイアログを表示します。これはちょっとした「ハック」であることはわかっていますが、それで十分です。
  2. Volley コードを編集して、すべてのリクエストに「isImmediate」フラグを追加します。これを実現するには、複数の方法があります。から始めることをお勧めしますCacheDispatcher
于 2013-11-14T08:45:07.817 に答える