0

我正在尝试在带有可绘制对象的自定义对话框中将图像设置为图像视图。我有以下方法

@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;
        }

现在,如果我连续获得具有相同图像的拨号,则会出现此错误:

Canvas trying to use a recycled bitmap Runtime Exception. 

任何帮助表示赞赏

4

2 回答 2

0

最好的方法是查看应用程序正在使用多少内存以及它在哪里使用它。你可能在某处泄漏。如果没有,请弄清楚如何减少整体内存使用量。Eclipse 可以为您获取堆使用情况转储。

于 2013-02-21T21:17:23.550 回答
0

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

要开始堆更新,您可以从 Eclipse 中切换到 DDMS 视图,并在其中选择与您的应用程序对应的进程,然后选择“显示堆更新”按钮。然后,每次单击“Cause GC”按钮时,您都会看到堆上对象的更新。

要使用 Eclipse 进行分析,您可以单击“转储 HPROF 文件”以使用 Eclipse 内存分析器加载它,这将为您提供更多关于可能泄漏的提示。

Android 开发者博客上的这篇博文更详细地介绍了:http ://android-developers.blogspot.ca/2011/03/memory-analysis-for-android.html

于 2013-02-21T23:38:50.073 回答