你可以修改 readBitMap 功能如下;
readBitMap
public Bitmap readBitMap(Context context, int resId, int position){ if (bmp[position] == null || bmp[position].isRecycled()) { BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inPreferredConfig = Bitmap.Config.RGB_565; opt.inPurgeable = true; opt.inInputShareable = true; DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); opt.inScaled = true; opt.inDensity = DisplayMetrics.DENSITY_DEFAULT; // !important InputStream is = context.getResources().openRawResource(resId); try { bmp[position] = BitmapFactory.decodeStream(is,null,opt); } catch (Exception e){ bmp[position] = null; } } return bmp[position]; }
某些类型的手机,特别是SAMSUNG,并没有精心设计内存泄漏。
的 opt.inDensity = DisplayMetrics.DENSITY_DEFAULT 强> 非常重要。
opt.inDensity = DisplayMetrics.DENSITY_DEFAULT
如果 inDensity 是 0 , BitmapFactory.decodeStream 将填写与资源相关的密度。 更多...
inDensity
0
BitmapFactory.decodeStream
你应该将imageview的位图设置为 null ,当您的活动(或页面)被破坏时。
null
尝试使用像Picasso或Glide这样的图像加载库。这将简化很多事情。
但在你的情况下,我认为问题不在于解码图像,而在于您持有已经在内存中创建的位图。确保您始终只在内存中有一个位图。只需在工作室中打开Profiler,并确认您是否存储了对多个位图的引用。
大小为750x1334的位图 RGB_565 config需要大约2MB的内存。其中3个可以存储在6 MB中,不应该创建 OutOfMemoryError 如果小心处理。
RGB_565
OutOfMemoryError
以下是您可以遵循的一些提示。
android:largeHeap="true"
FragmentStatePagerAdapter
ViewPager
Runtime.getRuntime().gc();
drawable
drawable-nodpi