たとえば、30分ごとにリクエストキューをクリアしたいと思います。
では、ボレーキャッシュを自動的にクリアする最良の方法は何ですか?
ボレーキャッシュクラスを拡張してメソッドをオーバーライドしますか?
または、必要なたびにキャッシュをクリアするタイマーを作成しますか?
Google Volleyには、キャッシュからアイテムをクリアする2つの方法があります。
AppController.getInstance().getRequestQueue().getCache().remove(key);
そして
AppController.getInstance().getRequestQueue().getCache().invalidate(key, fullExpire);
削除は、実際にキャッシュされたデータを削除することを意味します。
Invalidateは、データを無効としてマークしていることを意味します。そのため、ボレーはデータがまだ有効かどうかをサーバーに確認します。 full expireは、volleyがサーバーでデータを検証する前にデータを使用するかどうかを決定します。
30分ごとにキャッシュをクリアするには、以下のコードを使用します。-
ボレーのserverDateを使用して、応答が最初に受信された日付を次のように取得できます。
AppController.getInstance().getRequestQueue().getCache().get(url).serverDate
したがって、コードで使用するgetMinutesDifference function as
public static long getMinutesDifference(long timeStart,long timeStop){
long diff = timeStop - timeStart;
long diffMinutes = diff / (60 * 1000);
return diffMinutes;
}
コードでこの関数を次のように呼び出します
Calendar calendar = Calendar.getInstance();
long serverDate = AppController.getInstance().getRequestQueue().getCache().get(url).serverDate;
if(getMinutesDifference(serverDate, calendar.getTimeInMillis()) >=30){
AppController.getInstance().getRequestQueue().getCache().invalidate(url, true);
}
以前のURL応答が30分を超えると、キャッシュが無効になります。
これを行う簡単な方法は、onRequestFinishedメソッドをオーバーライドしてキャッシュをクリアすることです。または、30分後にタイマー内で実行できます。
final RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
requestQueue.addRequestFinishedListener(new RequestQueue.RequestFinishedListener<Object>() {
@Override
public void onRequestFinished(Request<Object> request) {
requestQueue.getCache().clear();
}
});
remove(key)
を使用してキャッシュからビットマップを削除しようとしましたが、機能していなかったため、putBitmap(String url, Bitmap bitmap)
が受信したURLを確認しました。 URLには_#W0#H#S7http...
_のようなプレフィックスが付いていることがわかりました。これは、ボレーが各URLに対してgetCacheKey(String url, int maxWidth, int maxHeight, ScaleType scaleType)
を呼び出すためです。 SOキャッシュからURLを削除したい場合は、URLのキーを取得するためにこの関数も呼び出す必要があります。
_ String key = mImageLoader.getCacheKey(url, 0, 0, ImageView.ScaleType.CENTER_INSIDE);
mRequestQueue.getCache().remove(key);
_
imageLoader.get(String requestUrl,ImageLoader.ImageListener listener)
を使用している場合は_0,0 and ImageView.ScaleType.CENTER_INSIDE
_を渡し、そうでない場合は使用している最小の高さと幅およびスケールタイプを渡します。
[〜#〜] note [〜#〜]getCacheKey()
はImageLoaderクラスのプライベート関数であるため、アプリ内で使用するにはパブリックに変更する必要があります。