0

Google コードを使用してダウンロードしたビットマップをキャッシュしようとしていますが、うまくいきません。

この記事からコードをダウンロードします: http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

コードで使用しましたが、使用する良い例が見つからなかったので、正しく使用していない可能性があります。

私の OnCreate には、次の行があります。

init(new ImageCacheParams(this, this.getApplicationContext().getCacheDir().getPath()));

初期化メソッド:

  private void init(ImageCacheParams cacheParams) {
                        mCacheParams = cacheParams;

                        // Set up memory cache
                        if (mCacheParams.memoryCacheEnabled) {
                            if (BuildConfig.DEBUG) {
                                Log.d(TAG, "Memory cache created (size = " + mCacheParams.memCacheSize + ")");
                            }

                            // If we're running on Honeycomb or newer, then
                            if (Utils.hasHoneycomb()) {
                                mReusableBitmaps = new HashSet<SoftReference<Bitmap>>();
                            }

                            mMemoryCache = new LruCache<String, BitmapDrawable>(mCacheParams.memCacheSize) {

                                /**
                                 * Notify the removed entry that is no longer being cached
                                 */
                                @Override
                                protected void entryRemoved(boolean evicted, String key,
                                        BitmapDrawable oldValue, BitmapDrawable newValue) {
                                    if (RecyclingBitmapDrawable.class.isInstance(oldValue)) {
                                        // The removed entry is a recycling drawable, so notify it 
                                        // that it has been removed from the memory cache
                                        ((RecyclingBitmapDrawable) oldValue).setIsCached(false);
                                    } else {
                                        // The removed entry is a standard BitmapDrawable

                                        if (Utils.hasHoneycomb()) {
                                            // We're running on Honeycomb or later, so add the bitmap
                                            // to a SoftRefrence set for possible use with inBitmap later
                                            mReusableBitmaps.add(new SoftReference<Bitmap>(oldValue.getBitmap()));
                                        }
                                    }
                                }

                                /**
                                 * Measure item size in kilobytes rather than units which is more practical
                                 * for a bitmap cache
                                 */
                                @Override
                                protected int sizeOf(String key, BitmapDrawable value) {
                                    final int bitmapSize = getBitmapSize(value) / 1024;
                                    return bitmapSize == 0 ? 1 : bitmapSize;
                                }
                            };
                        }

                        // By default the disk cache is not initialized here as it should be initialized
                        // on a separate thread due to disk access.
                        if (cacheParams.initDiskCacheOnCreate) {
                            // Set up disk cache
                           new InitializesCache().execute();
                        }
                    }

 class InitializesCache extends AsyncTask<String, Void, Void>
                {

                    protected Void doInBackground(String... args) {
                         initDiskCache();
                        return null;
                    }


public void initDiskCache() {
                    // Set up disk cache
                    synchronized (mDiskCacheLock) {
                        if (mDiskLruCache == null || mDiskLruCache.isClosed()) {
                            File diskCacheDir = mCacheParams.diskCacheDir;
                            if (mCacheParams.diskCacheEnabled && diskCacheDir != null) {
                                if (!diskCacheDir.exists()) {
                                    diskCacheDir.mkdirs();
                                }
                                if (getUsableSpace(diskCacheDir) > mCacheParams.diskCacheSize) {
                                    try {
                                        mDiskLruCache = DiskLruCache.open(
                                                diskCacheDir, 1, 1, mCacheParams.diskCacheSize);
                                        if (BuildConfig.DEBUG) {
                                            Log.d(TAG, "Disk cache initialized");
                                        }
                                    } catch (final IOException e) {
                                        mCacheParams.diskCacheDir = null;
                                        Log.e(TAG, "initDiskCache - " + e);
                                    }
                                }
                            }
                        }
                        mDiskCacheStarting = false;
                        mDiskCacheLock.notifyAll();
                    }
                }

自分のデータベースからビットマップをダウンロードするときに、次の行を使用します。

addBitmapToCache("foo", *some drawable*);

メソッド:

public void addBitmapToCache(String data, BitmapDrawable value) {
                    if (data == null || value == null) {
                        return;
                    }

                    // Add to memory cache
                    if (mMemoryCache != null) {
                        if (RecyclingBitmapDrawable.class.isInstance(value)) {
                            // The removed entry is a recycling drawable, so notify it 
                            // that it has been added into the memory cache
                            ((RecyclingBitmapDrawable) value).setIsCached(true);
                        }
                        mMemoryCache.put(data, value);
                    }

                    synchronized (mDiskCacheLock) {
                        // Add to disk cache
                        if (mDiskLruCache != null) {
                            final String key = hashKeyForDisk(data);
                            OutputStream out = null;
                            try {
                                DiskLruCache.Snapshot snapshot = mDiskLruCache.get(key);
                                if (snapshot == null) {
                                    final DiskLruCache.Editor editor = mDiskLruCache.edit(key);
                                    if (editor != null) {
                                        out = editor.newOutputStream(DISK_CACHE_INDEX);
                                        value.getBitmap().compress(
                                                mCacheParams.compressFormat, mCacheParams.compressQuality, out);
                                        editor.commit();
                                        out.close();
                                    }
                                } else {
                                    snapshot.getInputStream(DISK_CACHE_INDEX).close();
                                }
                            } catch (final IOException e) {
                                Log.e(TAG, "addBitmapToCache - " + e);
                            } catch (Exception e) {
                                Log.e(TAG, "addBitmapToCache - " + e);
                            } finally {
                                try {
                                    if (out != null) {
                                        out.close();
                                    }
                                } catch (IOException e) {}
                            }
                        }
                    }
                }

その後、これを呼び出してビットマップを取得しようとします:

tempImage.setImageDrawable(getBitmapFromMemCache("foo"));

 public BitmapDrawable getBitmapFromMemCache(String data) {
                    BitmapDrawable memValue = null;

                    if (mMemoryCache != null) {
                        memValue = mMemoryCache.get(data);
                    }

                    if (BuildConfig.DEBUG && memValue != null) {
                        Log.d(TAG, "Memory cache hit");
                    }

                    return memValue;
                }

このフローを使用すると、ビットマップが表示されず、エラーも発生しません。

キャッシュを行うための他のgitコードも調べてみましたが、すべてのコードは使用方法が明確ではなく、例が不足しているか、説明がまったくありません。

4

1 に答える 1

0

ビットマップの読み込みとキャッシュにライブラリ Android Universal Image Loaderを使用する

于 2013-08-28T23:24:36.787 に答える