「Android/DiskLruCache」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→公式?) |
(→公式?) |
||
行11: | 行11: | ||
google | google | ||
https://android.googlesource.com/platform/libcore/+/jb-mr2-release/luni/src/main/java/libcore/io/DiskLruCache.java | https://android.googlesource.com/platform/libcore/+/jb-mr2-release/luni/src/main/java/libcore/io/DiskLruCache.java | ||
+ | |||
+ | okhttp3 | ||
+ | https://github.com/square/okhttp/blob/master/okhttp/src/main/java/okhttp3/internal/cache/DiskLruCache.java | ||
+ | |||
+ | mopub | ||
+ | https://github.com/mopub/mopub-android-sdk/blob/master/mopub-sdk/mopub-sdk-base/src/main/java/com/mopub/common/DiskLruCache.java | ||
+ | ==bitmapサンプル== | ||
+ | https://developer.android.com/topic/performance/graphics/cache-bitmap#java | ||
+ | |||
+ | <pre> | ||
+ | private DiskLruCache mDiskLruCache; | ||
+ | private final Object mDiskCacheLock = new Object(); | ||
+ | private boolean mDiskCacheStarting = true; | ||
+ | private static final int DISK_CACHE_SIZE = 1024 * 1024 * 10; // 10MB | ||
+ | private static final String DISK_CACHE_SUBDIR = "thumbnails"; | ||
+ | |||
+ | @Override | ||
+ | protected void onCreate(Bundle savedInstanceState) { | ||
+ | ... | ||
+ | // Initialize memory cache | ||
+ | ... | ||
+ | // Initialize disk cache on background thread | ||
+ | File cacheDir = getDiskCacheDir(this, DISK_CACHE_SUBDIR); | ||
+ | new InitDiskCacheTask().execute(cacheDir); | ||
+ | ... | ||
+ | } | ||
+ | |||
+ | class InitDiskCacheTask extends AsyncTask<File, Void, Void> { | ||
+ | @Override | ||
+ | protected Void doInBackground(File... params) { | ||
+ | synchronized (mDiskCacheLock) { | ||
+ | File cacheDir = params[0]; | ||
+ | mDiskLruCache = DiskLruCache.open(cacheDir, DISK_CACHE_SIZE); | ||
+ | mDiskCacheStarting = false; // Finished initialization | ||
+ | mDiskCacheLock.notifyAll(); // Wake any waiting threads | ||
+ | } | ||
+ | return null; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> { | ||
+ | ... | ||
+ | // Decode image in background. | ||
+ | @Override | ||
+ | protected Bitmap doInBackground(Integer... params) { | ||
+ | final String imageKey = String.valueOf(params[0]); | ||
+ | |||
+ | // Check disk cache in background thread | ||
+ | Bitmap bitmap = getBitmapFromDiskCache(imageKey); | ||
+ | |||
+ | if (bitmap == null) { // Not found in disk cache | ||
+ | // Process as normal | ||
+ | final Bitmap bitmap = decodeSampledBitmapFromResource( | ||
+ | getResources(), params[0], 100, 100)); | ||
+ | } | ||
+ | |||
+ | // Add final bitmap to caches | ||
+ | addBitmapToCache(imageKey, bitmap); | ||
+ | |||
+ | return bitmap; | ||
+ | } | ||
+ | ... | ||
+ | } | ||
+ | |||
+ | public void addBitmapToCache(String key, Bitmap bitmap) { | ||
+ | // Add to memory cache as before | ||
+ | if (getBitmapFromMemCache(key) == null) { | ||
+ | mMemoryCache.put(key, bitmap); | ||
+ | } | ||
+ | |||
+ | // Also add to disk cache | ||
+ | synchronized (mDiskCacheLock) { | ||
+ | if (mDiskLruCache != null && mDiskLruCache.get(key) == null) { | ||
+ | mDiskLruCache.put(key, bitmap); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | public Bitmap getBitmapFromDiskCache(String key) { | ||
+ | synchronized (mDiskCacheLock) { | ||
+ | // Wait while disk cache is started from background thread | ||
+ | while (mDiskCacheStarting) { | ||
+ | try { | ||
+ | mDiskCacheLock.wait(); | ||
+ | } catch (InterruptedException e) {} | ||
+ | } | ||
+ | if (mDiskLruCache != null) { | ||
+ | return mDiskLruCache.get(key); | ||
+ | } | ||
+ | } | ||
+ | return null; | ||
+ | } | ||
+ | |||
+ | // Creates a unique subdirectory of the designated app cache directory. Tries to use external | ||
+ | // but if not mounted, falls back on internal storage. | ||
+ | public static File getDiskCacheDir(Context context, String uniqueName) { | ||
+ | // Check if media is mounted or storage is built-in, if so, try and use external cache dir | ||
+ | // otherwise use internal cache dir | ||
+ | final String cachePath = | ||
+ | Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || | ||
+ | !isExternalStorageRemovable() ? getExternalCacheDir(context).getPath() : | ||
+ | context.getCacheDir().getPath(); | ||
+ | |||
+ | return new File(cachePath + File.separator + uniqueName); | ||
+ | } | ||
+ | </pre> |
2018年11月27日 (火) 18:10時点における版
準備
以下追加
- app/build.gradle
dependencies { implementation 'com.jakewharton:disklrucache:2.0.2' }
公式?
https://github.com/JakeWharton/DiskLruCache
bitmapサンプル
https://developer.android.com/topic/performance/graphics/cache-bitmap#java
private DiskLruCache mDiskLruCache; private final Object mDiskCacheLock = new Object(); private boolean mDiskCacheStarting = true; private static final int DISK_CACHE_SIZE = 1024 * 1024 * 10; // 10MB private static final String DISK_CACHE_SUBDIR = "thumbnails"; @Override protected void onCreate(Bundle savedInstanceState) { ... // Initialize memory cache ... // Initialize disk cache on background thread File cacheDir = getDiskCacheDir(this, DISK_CACHE_SUBDIR); new InitDiskCacheTask().execute(cacheDir); ... } class InitDiskCacheTask extends AsyncTask<File, Void, Void> { @Override protected Void doInBackground(File... params) { synchronized (mDiskCacheLock) { File cacheDir = params[0]; mDiskLruCache = DiskLruCache.open(cacheDir, DISK_CACHE_SIZE); mDiskCacheStarting = false; // Finished initialization mDiskCacheLock.notifyAll(); // Wake any waiting threads } return null; } } class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> { ... // Decode image in background. @Override protected Bitmap doInBackground(Integer... params) { final String imageKey = String.valueOf(params[0]); // Check disk cache in background thread Bitmap bitmap = getBitmapFromDiskCache(imageKey); if (bitmap == null) { // Not found in disk cache // Process as normal final Bitmap bitmap = decodeSampledBitmapFromResource( getResources(), params[0], 100, 100)); } // Add final bitmap to caches addBitmapToCache(imageKey, bitmap); return bitmap; } ... } public void addBitmapToCache(String key, Bitmap bitmap) { // Add to memory cache as before if (getBitmapFromMemCache(key) == null) { mMemoryCache.put(key, bitmap); } // Also add to disk cache synchronized (mDiskCacheLock) { if (mDiskLruCache != null && mDiskLruCache.get(key) == null) { mDiskLruCache.put(key, bitmap); } } } public Bitmap getBitmapFromDiskCache(String key) { synchronized (mDiskCacheLock) { // Wait while disk cache is started from background thread while (mDiskCacheStarting) { try { mDiskCacheLock.wait(); } catch (InterruptedException e) {} } if (mDiskLruCache != null) { return mDiskLruCache.get(key); } } return null; } // Creates a unique subdirectory of the designated app cache directory. Tries to use external // but if not mounted, falls back on internal storage. public static File getDiskCacheDir(Context context, String uniqueName) { // Check if media is mounted or storage is built-in, if so, try and use external cache dir // otherwise use internal cache dir final String cachePath = Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || !isExternalStorageRemovable() ? getExternalCacheDir(context).getPath() : context.getCacheDir().getPath(); return new File(cachePath + File.separator + uniqueName); }