2013-02-21 127 views
0

我想在一个带drawable的自定义对话框中将图像设置为imageview。我有以下方法最好的方法来处理OOME android

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
     this.setCancelable(false); 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     LayoutInflater inflater = getActivity().getLayoutInflater(); 
     ViewGroup vg = (ViewGroup)inflater.inflate(R.layout.popup, null); 
     image= (ImageView) vg.findViewById(R.id.image); 
     Uri uri = Uri.parse("android.resource://"+this.getActivity().getPackageName()+"/drawable/p1"); 
     image.setImageURI(uri); 
. 
. 
return builder.create(); 
} 

它大部分时间运行良好,但会导致xxxx字节分配的内存不足。

我知道那是因为这个

image.setImageURI(uri); 

什么是最好的方式来摆脱这个问题的?

更新::

I tried to recycle the bitmap by using this 

Bitmap bitmap = ((BitmapDrawable)image.getDrawable()).getBitmap(); 
     if(!bitmap.isRecycled()){ 
     bitmap.recycle(); 
     bitmap =null; 
     } 

现在,如果我得到相同的图像dialong连续我有这样的错误:

Canvas trying to use a recycled bitmap Runtime Exception. 

任何帮助表示赞赏

回答

0

最好的办法是看分析应用程序使用的内存以及使用它的位置。你可能在某处泄漏。如果不是,请找出如何减少整体内存使用量。 Eclipse可以为您获取堆使用情况转储。

+0

你能告诉我,如果我要重新调整和有效的对话上应用的图像?或者指点我一些资源?对话框被重复调用,并且我没有在显示器上使用任何静态变量来泄漏上下文。它只是弹出一个图像,这个OOME并不总是发生..只有很少的 – 2013-02-21 21:21:31

+0

这不一定是这个对话框导致的问题。这意味着您的应用的内存使用总量过高。它恰好在这里失败了。你不能单独看这个对话框,你需要查看应用程序使用的所有内存。 – 2013-02-21 21:23:46

+0

那么,活​​动的UI是一个按钮和textview,你会弹出一个。可绘制图像是1280x720图像。所以我在想这是导致错误。但图像的大小是150 kB。我已经感到沮丧,已经调试。我非常感谢您耐心回答我。 – 2013-02-21 21:40:07

0

Eclipse内存分析器(http://www.eclipse.org/mat/)可以帮助您找到泄漏,并结合DDMS和堆分析器。

要启动堆更新,您可以从Eclipse内切换到DDMS视图,然后在那里选择与您的应用对应的进程,然后选择“显示堆更新”按钮。然后,每次单击“原因GC”按钮时,都会看到堆中对象的更新。

要使用Eclipse分析此问题,可以单击“转储HPROF文件”以使用Eclipse内存分析器加载它,这会为您提供有关可能泄漏的内容的更多提示。

此博客张贴在Android开发者博客进入到更多细节:http://android-developers.blogspot.ca/2011/03/memory-analysis-for-android.html

相关问题