LoginSignup
15
14

More than 5 years have passed since last update.

Glide のキャッシュ削除を行うスレッドに注意

Last updated at Posted at 2016-02-02

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    }
15
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
14