1

我有一些活动可以在这个 lib的帮助下显示图像。问题是应用程序内存不足。我试图 gc.clean(),空引用,在 imageloader 对象上调用 clear,但徒劳无功。

在 MAT 中,我发现我有多个相同活动的对象,如果我没记错的话,这是默认行为。我使用 singleInstance 来抑制多个实例,它有助于解决内存泄漏。

现在,由于 singleInstance,我在导航方面遇到了麻烦。您认为我应该继续使用 singleInstance 还是尝试使用多个实例修复内存泄漏?

这是 ImageView gc 根检查: 在此处输入图像描述

升级版:

 Bitmap bitmap=null;
        URL imageUrl = new URL(url);
        HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
        conn.setConnectTimeout(30000);
        conn.setReadTimeout(30000);
        conn.setInstanceFollowRedirects(true);
        InputStream is=conn.getInputStream();
        OutputStream os = new FileOutputStream(f);
        Utils.CopyStream(is, os);
        os.close();
        bitmap = decodeFile(f);
        return bitmap;

    ImageView imageView = (ImageView) convertView;
    if(convertView == null){
        imageView = new ImageView(_currentActivity);
    }

UPD2(导航策略):

我有一个恒定的标题,带有开始家庭活动(带画廊)和个人资料活动的按钮;其次,有一个子标题,它还包含 3 个按钮,这些按钮指向另外 3 个带有列表视图的活动(由图像视图 + 标签组成)。

这些标题、子标题元素可用于应用程序中的每个活动;链接按钮除了:

startActivity(new Intent(getActivity(), MainActivity.class));

或者

Intent activityIntent = new Intent(getActivity(), SomeActivityWithListViewInside.class);
// passing some data like list id
activityIntent.putExtra("list_id", listId);
startActivity(activityIntent);

那么,这些活动实例是由那些 startActivity 调用引起的 - 你认为我应该使用 singleTop 或任何其他意图参数来避免这个问题吗?

4

3 回答 3

3

我强烈建议不要使用活动的奇怪标志。我也总是在使用 android API 时遇到导航问题(并且仍然存在,即使是片段)。

相反,我建议您解决内存问题。

您应该观看有关内存泄漏的视频,并阅读有关位图的视频。

简而言之,这里有一些提示:

  1. 尽量避免静态引用,尤其是当它们引用上下文时。

  2. 尽量避免引用上下文。

  3. 如果必须引用 context ,请考虑使用 ApplicationContext。

  4. 记得在关闭活动时关闭线程和对话框(如果需要)。尝试在不再需要服务时关闭它们。

  5. 比非静态内部类更喜欢静态内部类(因为它们引用了包含类)。

  6. 请记住,匿名类也有对包含类的引用。

  7. 小心你缓存的东西。尽量避免缓存包含上下文引用的类,例如视图和可绘制对象。

  8. 如果可能,尝试使用 softReference 和/或 weakReference 来引用引用 context 的“危险”对象。

  9. 在 android API 10 及更低版本上,请记住回收您的位图。他们通常会占用大量内存。

  10. 如果一个活动占用了太多内存并且您从它转到另一个活动,请考虑完成它并在需要时重新创建它,而不是回到它的旧实例。

  11. 如果您使用任何第三方库或使用本机代码(例如使用 NDK),请不要忘记在不需要时释放其内存。dalvik 不会帮你太多。

于 2012-06-25T14:17:35.520 回答
1

您不应该使用 singleInstance 启动模式。您需要使用标准和/或 singleTop 启动模式让您的导航正常工作。如果您发现您的活动有多个实例,但您没有预料到,那么您的导航有问题。拥有多个活动实例会保留所有视图和图像,这可能是导致内存不足问题的原因。

使用您预期的导航以及您如何管理它来更新您的帖子,也许我们可以帮助您解决这个问题。

编辑:回复海报的 UPD:

我不知道你在哪里设置_currentActivity,但这可能是你的问题。当您在适配器中创建视图时,您应该始终使用适配器的上下文(在创建时设置)。所以试试这个:

ImageView imageView = (ImageView) convertView;
if(convertView == null){
    imageView = new ImageView(getContext());
}

编辑:回复海报的 UPD2:

您需要检查您的导航以确保当用户选择您的标题或子标题中的一个按钮时,您的活动堆栈中没有多个活动实例(如果这不是您想要的)。如果您的活动使用大量图像空间(位图等),那么您需要确保没有多个实例。您可以重新考虑您的导航,或者您可以使用 singleTop、clearTop、reorderToFront 等的组合,这样您就不必继续创建活动实例,而只需在活动堆栈中重新排列它们以获得所需的导航行为。

于 2012-06-25T17:13:56.847 回答
0

在创建视图时将活动作为上下文传递是不好的:这会阻止活动被“释放”。此外,您可能希望将位图缩小到您真正需要的大小。

于 2012-06-25T20:06:26.863 回答