0

我正在使用 Google 的示例在配置更改中缓存位图,几乎是逐行的:

http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html#config-changes

我在更新字段时调用 addBitmapToMemoryCache,这是在配置更改(设备轮换)之前的方式。但是,将调试信息放入 findOrCreateRetainFragment 后:

public static RetainFragment findOrCreateRetainFragment(FragmentManager fm) {
    RetainFragment fragment = (RetainFragment) fm.findFragmentByTag(TAG);
    if (fragment == null) {
        fragment = new RetainFragment();
        Log.w("myapp", "instanciating new retainfragment");
        fm.beginTransaction().add(fragment, TAG).commit();
    } else {
        Log.w("myapp", "using old retainfragment");
    }
    return fragment;
}

该片段始终是新实例化的,因此我永远无法访问旧的 LruCache,尽管setRetainInstance(true). 谷歌的例子有问题吗?我正在使用 v4 支持 FragmentManager。

这是我的 onCreate 的相关部分:

RetainFragment retainFragment =
            RetainFragment.findOrCreateRetainFragment(getSupportFragmentManager());
mMemoryCache = retainFragment.mRetainedCache;
if (mMemoryCache == null) {
    mMemoryCache = new LruCache<String, Bitmap>(3 * 1024 * 1024) {
        @Override
        protected int sizeOf(String key, Bitmap bitmap) {
            return bitmap.getByteCount() / 1024;
        }
    };
    retainFragment.mRetainedCache = mMemoryCache;
} else {
    backgroundsByMonth = new ArrayList<>();
    for (int i = 0; i < 12; i++) {
        BitmapDrawable bd = new BitmapDrawable(getResources(), mMemoryCache.get(Integer.toString(i)));
        backgroundsByMonth.add(bd);
    }
}
4

1 回答 1

0

事实证明,我的 onSaveInstanceState 没有调用超类 onSaveInstanceState,这会导致片段管理器丢失片段实例。添加

     super.onSaveInstanceState(out);

解决它。

于 2014-12-22T23:58:47.793 回答