相关疑难解决方法(0)

可绘制与单个可重用位图更好的内存?

据我所知(并非我是正确的)当应用程序完成后,Drawable通常会从内存中正确删除.但是,位图需要手动回收,有时甚至会编写一个特殊的类来正确处理它们.我的问题是,关于内存和泄漏,简单地坚持像这样的Drawables是更有利的:

myView.setBackgroundDrawable(getResources().getDrawable(R.drawable.my_image));
myView1.setBackgroundDrawable(getResources().getDrawable(R.drawable.my_image1));
myView2.setBackgroundDrawable(getResources().getDrawable(R.drawable.my_image2));
Run Code Online (Sandbox Code Playgroud)

而不是使用Bitmaps这样的东西:

Bitmap tmpBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_image);
myView.setImageBitmap(tmpBitmap);

tmpBitmap.recycle();
tmpBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_image1);
myView1.setImageBitmap(tmpBitmap);

tmpBitmap.recycle();
tmpBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_image2);
myView2.setImageBitmap(tmpBitmap);
tmpBitmap.recycle();
Run Code Online (Sandbox Code Playgroud)

我当然也读过你必须要小心bitmaps上的recycle()方法,因为它们可以在使用时删除吗?似乎这些问题不断出现在不同的形式,但我无法真正得到任何人的直接答案.一个人说在每次使用后重复使用Bitmap并回收,其他人说使用Drawables和unbindDrawables()方法(这是我一直在使用的):

private void unbindDrawables(View view) {
    if (view.getBackground() != null) {
        view.getBackground().setCallback(null);
    }
    if (view instanceof ViewGroup) {
        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
            unbindDrawables(((ViewGroup) view).getChildAt(i));
        }
        ((ViewGroup) view).removeAllViews();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,任何适用的见解都会非常受欢迎.谢谢

memory android bitmap recycle drawable

20
推荐指数
2
解决办法
1万
查看次数

为什么我的所有位图都上采样200%?

我的应用程序中存在严重的内存问题[1].为了研究这个问题,我在不同的州采取了我的应用程序的堆积.我看到一些位图占用了大量内存.我写了一个小工具[2],将字节数组解码为Windows位图文件(.bmp),这样我就可以看到位图并将它们与我res/drawable文件夹中的文件进行比较.

我发现我的所有文件都被上采样两次.
我首先检查了最大的一个:堆中超过9MB的字节数组缓冲区,它被解码为一个漂亮的1920x1280图片,而原始的是一个960x640 png文件.
我尝试了第二大,超过3MB,曾经解码显示一个漂亮的754x1200图片,原始大小是......猜怎么着?一个不错的377x600 jpg文件.

是什么赋予了?

我在我的Android Manifest文件中启用了硬件加速(虽然我不确定我真的需要它,我只是使用一些基本的视图和活动).
我在GSM Galaxy Nexus(yakju)上运行Android 4.0.2.我收到测试人员的反馈,他们的4.0.3 Nexus S上存在问题,但我还是无法检查他们的堆转储.

我试图在这里节省内存,如果Android将所有内容加倍,难怪应用程序很快崩溃,因为堆使用率过高(在我的情况下大约为64MB).我希望有一个理由和方法.

参考文献:

  1. 加载活动时出现OutOfMemoryError
  2. 如何实际查看从Android堆转储中获取的位图

heap android memory-management bitmap out-of-memory

6
推荐指数
1
解决办法
625
查看次数