Android の画像表示ライブラリ Glide のキャッシュ削除を行うスレッドに注意
※Glide 3.6.1 で確認済み。
結論
デフォルトのキャッシュ機構を使っている場合、
-
Glide#clearDiskCache
はバックグラウンドスレッドで -
Glide#clearMemory
はメインスレッドで
実行しないと例外がでる。
適切なスレッドで削除を行うサンプル
final Glide glide = Glide.get(MainActivity.this);
glide.clearMemory(); // メインスレッドで実行しないといけない
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
glide.clearDiskCache(); // バックグラウンドスレッドで実行しないといけない
return null;
}
}.execute();
詳しく
Glide は、Android で画像表示・キャッシュコントロールを簡単にしてくれるライブラリです。
お世話になってます。
ディスクキャッシュとメモリキャッシュの二階層のキャッシュを備えています。
それぞれのキャッシュをクリアする API も備えています。
不適切なスレッドで削除したときのエラー
Glide#clearDiskCache
java.lang.IllegalArgumentException: YOu must call this method on a background thread
at com.bumptech.glide.util.Util.assertBackgroundThread(Util.java:144)
at com.bumptech.glide.Glide.clearDiskCache(Glide.java:391)
エラー文見れば明らかですね。
com.bumptech.glide.Glide.java
390 public void clearDiskCache() {
391 Util.assertBackgroundThread();
392 getEngine().clearDiskCache();
393 }
実装見ると、呼び出した瞬間チェックが行われているのでわかりやすいです。
Glide#clearMemory
Caused by: java.lang.IllegalArgumentException: You must call this method on the main thread
at com.bumptech.glide.util.Util.assertMainThread(Util.java:135)
at com.bumptech.glide.load.engine.Engine.onResourceRemoved(Engine.java:282)
at com.bumptech.glide.load.engine.cache.LruResourceCache.onItemEvicted(LruResourceCache.java:32)
at com.bumptech.glide.load.engine.cache.LruResourceCache.onItemEvicted(LruResourceCache.java:12)
at com.bumptech.glide.util.LruCache.trimToSize(LruCache.java:162)
at com.bumptech.glide.util.LruCache.clearMemory(LruCache.java:146)
at com.bumptech.glide.Glide.clearMemory(Glide.java:370)
こちらも明らか。
でも、こちらは 実際にクリア処理が走らない限りエラーにならない ので要注意。
気をつけましょう。
com.bumptech.glide.util.LurCache.java
154 protected void trimToSize(int size) {
155 Map.Entry<T, Y> last;
156 while (currentSize > size) {
157 last = cache.entrySet().iterator().next();
158 final Y toRemove = last.getValue();
159 currentSize -= getSize(toRemove);
160 final T key = last.getKey();
161 cache.remove(key);
162 onItemEvicted(key, toRemove); // この中でスレッドチェックが行われている
163 }
164 }