使用位图和 Volley 查看寻呼机内存泄漏

2024-01-12

我正在使用 View Pager 在我的应用程序中显示从网络下载的图像。图像的数量可以是 5 到 20。我正在使用 Volley 库来进行网络操作。该应用程序之前并没有占用太多内存,但现在添加视图寻呼机后,该应用程序占用了大量内存,每次我打开此活动时,堆中使用的内存都会增加(从日志消息中检查)。我还使用 Eclipse 内存分析器来检查泄漏位置,肯定是位图和该活动的多个实例。肯定存在泄漏,因为此活动没有被 GC 处理,一些引用阻止了它被垃圾收集。我在这里添加了视图寻呼机的实现。

public class ViewPagerAdapter extends PagerAdapter {
        Context context;

        public ViewPagerAdapter(Context context) {
            this.context = context;
        }

        @Override
        public int getCount() {
            return photoReferences.size();
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == ((RelativeLayout) object);
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            final ImageView im;
            final ProgressBar pb;

            View itemView = inflater.inflate(R.layout.place_photos_item, container, false);

            im = (ImageView) itemView.findViewById(R.id.placeImage);
            attributes = (TextView) itemView.findViewById(R.id.placeAttributes);
            pb = (ProgressBar) itemView.findViewById(R.id.progressBarPhoto);

            imageLoader.get(url, new ImageListener() {

                public void onErrorResponse(VolleyError arg0) {
                    im.setImageResource(R.drawable.onErrorImage); 
                }

                public void onResponse(ImageContainer response, boolean arg1) {
                    if (response.getBitmap() != null) {
                        im.startAnimation(AnimationUtils.loadAnimation(context, android.R.anim.fade_in));
                        im.setImageBitmap(response.getBitmap());
                        pb.setVisibility(View.GONE);
                    } 
                }
            });

            ((ViewPager) container).addView(itemView);

            return itemView;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            ((ViewPager) container).removeView((RelativeLayout) object);
        }

    }

另外,我使用的位图缓存大小是屏幕字节数的 3 倍(屏幕宽度 * 屏幕高度 * 4)。我正在运行 4.3 的 Nexus 4 上进行测试,我从未遇到 OOM 异常,因为该设备上的堆大小很大,但如果我打开 Activity,应用程序可能会占用超过 100 MB 的内存(在大多数设备上会崩溃)一次又一次,之前无论如何都会占用大约 16-20 mbs 的内存。这是缓存代码。

public class BitmapCache extends LruCache<Object, Object> implements ImageCache {
        public BitmapCache(int maxSize) {
            super(maxSize);
        }

        @Override
        public Bitmap getBitmap(String url) {
            return (Bitmap) get(url);
        }

        @Override
        public void putBitmap(String url, Bitmap bitmap) {
            put(url, bitmap);
        }
    }

谁能建议我该怎么做才能抓住泄漏? View Pager 或我的 Volley 使用有什么问题吗?我对寻呼机的转换也不满意,有点滞后,这有关系吗?

Update: 这是 MAT 的屏幕截图,可能存在泄漏 http://imgur.com/tu5TMoS。这是关于使用 Volley 库的每个活动。我读了很多书,但无法解决问题。齐射导致泄漏还是我做错了什么?


您可以使用 MAT 找到泄漏点。首先,运行应用程序并泄漏一些活动实例。然后,您获取堆的快照并查找那些泄漏的 Activity 对象...您可以使用“对象查询语言”(OQL) 按类型查找它们(例如“SELECT * FROM com.foo.FooActivity”)。

找到泄漏的对象后,右键单击它并要求 MAT 将其所有传入引用追溯到其 GC 根。泄露的参考文献将是其中之一。

为了更好地介绍该技术,您可以尝试这篇文章:

http://android-developers.blogspot.co.uk/2011/03/memory-analysis-for-android.html http://android-developers.blogspot.co.uk/2011/03/memory-analysis-for-android.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用位图和 Volley 查看寻呼机内存泄漏 的相关文章

  • Whatsapp 在 Android 中共享音频文件时正在剪切音频文件

    我在共享格式不是 mp3 的音频文件时遇到问题 文件被共享 但长度较短 例如 如果文件有 10 秒 则仅共享 5 秒 如果我使用 mp3 格式 它会完全共享 但其他格式会出现问题 注意 该文件在其他应用程序 如Messenger 中共享没有
  • 更改操作栏标题文本颜色

    我正在尝试更改 ActionBar 中标题文本的颜色 但我似乎无法让它工作 这是我尝试使用的风格 在我的应用程序主题中我使用titleTextStyle
  • Android Studio磁盘空间不足如何解决?

    我随机收到此错误 并且不确定为什么 Android Studio 的磁盘空间变低 Android Studio 系统目录分区磁盘空间不足 Update 此应用程序安装在运行 10 10 1 的 Mac 上 具有 251GB 内部存储和占用
  • Android 上通过 JSCH 的基本 SSH 连接

    作为来自此的用户question https stackoverflow com questions 14323661 simple ssh connect with jsch和这个tutorial http eridem net andr
  • Android 上的硬币识别

    我目前正在开发一个 Android 应用程序 它能够拍摄硬币的现有图像 或者使用内置摄像头扫描单个硬币 非常像 Google Goggles 我正在使用 Android 版 OpenCV 我的问题如下 什么方法最适合使用 OpenCV 在
  • PhoneGap 是应用程序开发的好选择吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Android,语言文件不起作用

    我现在正在创建一个 Android 应用程序 并尝试为我的母语添加语言文件 但在某种程度上 这对我不起作用 我尝试在两部不同的手机中加载该应用程序 但结果相同 之前创建过语言文件 效果良好 但这次不行 手机设置为瑞典语 语言文件适用于我创建
  • 注销时Firebase facebook按钮android身份验证

    我在我的 Android 应用程序中使用 firebase 并在 facebook SDK 中使用登录 我面临的唯一问题是 当我使用 facebook 登录然后注销时 facebook 登录按钮处于 注销 状态 当我单击它时 它会询问我是否
  • Twitter 集成期间获取访问令牌函数行为不当

    我只是想使用 twitter4j 从我的 Android 应用程序向 Twitter 分享文本 首先 我尝试的是我创建了一个新项目 并且这个特定的代码运行成功 然后我在我的应用程序中混合了该特定代码 登录 Twitter 成功完成 之后我发
  • 将 ArrayList 保存在捆绑包 savingInstanceState 中

    ArrayList 是在类级别定义的 这些是我保存的实例方法 Override protected void onSaveInstanceState Bundle outState super onSaveInstanceState out
  • 如何在Firebase Android应用程序中分离两个不同的用户?

    我有一个应用程序 有两种不同类型的用户 一种是教师 第二种是普通用户 如果普通会员登录 他会去normal memberActivity如果他是教师会员 他会去Teacher memberActivity 我如何在登录活动中执行此操作 我的
  • Android 在创建时出现 SQLiteException

    首先我想说我是android新手 所以如果这个问题太愚蠢我很抱歉 我正在为带有两个表的 SQLite 数据库编写一个内容提供程序 表格上是在导航抽屉活动中显示列表 第二个表格是在 ListFragment 中显示 每次启动应用程序时 我都会
  • 如何知道点击的widget id?

    我已经实施了一个widget与ImageButton and a TextView That ImageButton启动一个activity当它被点击时 这activity使用用户在活动上写入的内容更新小部件文本EditText 现在的问题
  • 如何在不改变的情况下将字符串转换为字节?

    我需要一个解决方案将字符串转换为字节数组而不需要像这样进行更改 Input String s Test Output String s Test byte b Test 当我使用 s getBytes 那么回复是 B 428b76b8 但我
  • 对基本适配器类及其功能的疑问

    我正在尝试自定义列表视图 我使用数组列表添加对象列表 并将其发送到扩展基本适配器的类 当我扩展基本适配器类时 它实现了一些方法 例如 getView 等 在 getView 中 我将其发送到将名称 数据 分配给 XML 格式的自定义菜单的类
  • NoClassDefFoundError:com.google.firebase.FirebaseOptions

    我继续得到NoClassDefFoundError在我正在使用的其他测试设备 4 4 2 上 但在我的测试设备 Android 5 1 上运行良好 我尝试了用谷歌搜索的解决方案 但似乎没有任何效果 我正在使用 Firebase 实时数据库
  • 从 AlertDialog 返回值

    我想构建一个函数来创建 AlertDialog 并返回用户输入的字符串 这是我用于创建对话框的函数 如何返回该值 String m Text private String openDialog String title AlertDialo
  • 在 TextView onTextChanged 上设置文本

    我有一个定义为类属性的文本视图 以便我可以在整个类中访问它 在 onCreate 方法中我执行以下操作 chars TextView findViewById R id chars chars setText 300 之后 public v
  • Java中如何限制文件大小

    我正在我的应用程序中创建一个文件 并继续向该文件中写入一些内容 但是当我的文件达到一定大小 比如说 100 行 后 我想删除第一行并将新行写入底部 要求是我的文件应该受到限制 但它应该保留我写入文件的最新内容 请告诉我在Java中是否可行
  • 如何用 XML 制作双渐变(类似 iphone)

    如何使用 XML 制作这种可绘制渐变 我可以做一个从颜色 A 到颜色 B 的简单渐变 但我不知道如何在同一个可绘制对象中组合两个渐变 我终于找到了一个带有图层列表的解决方案 这对我来说已经足够好了

随机推荐

  • 标准化 URI 以仅提取域名的最佳方法是什么?

    例如 http www google co uk www google co uk google co uk 将全部转换为 google co uk 我本来想使用 System Uri 类 但这似乎只接受带有方案的 url 提取域名很简单
  • Swift:将一组字典扁平化为一个字典

    在 Swift 中 我试图将一组字典扁平化为一个字典 IE let arrayOfDictionaries key1 value1 key2 value2 key3 value3 key4 value4 the end result wil
  • 为什么 Angular Google 地图中的 元素需要 ng-non-bindable?

    我有一个关于的元素角度谷歌地图 http angular ui github io angular google maps api插入 Windows 元素文档中的示例源代码使用ng non bindable属性为 div 里面的 div
  • 突出显示表格行

    我有以下表结构 table tbody tr td Lorem td td Ipsum td td Fierent td tr tr td Lorem ipsum td td pro ut tale erant td td mnesarch
  • 通过发送意图来启动 Android WiFi 管理器?

    我正在开发一个应用程序 我想要一个按钮 打开Android内置的WiFi菜单 我真的不想自己实现扫描和连接代码 我可以发送任何打开此菜单的意图吗 你应该使用ACTION PICK WIFI NETWORK http developer an
  • Nutch 爬取文档的 Elasticsearch 映射面临问题

    使用 nutch 和 elasticsearch 进行爬行时面临一些严重的问题 我们的应用程序中有两个数据存储引擎 MySql 弹性搜索 假设我有 10 个 url 存储在 mysql 数据库的 urls 表中 现在我想在运行时从表中获取这
  • chain(*iterable) 与 chain.from_iterable(iterable) 之间的区别

    我对所有有趣的迭代器着迷itertools 但我遇到的一个困惑是这两个函数之间的区别以及为什么chain from iterable exists from itertools import chain def foo n for i in
  • Chrome 中的 Tab 悬停事件

    chrome 扩展 api 是否提供将鼠标悬停在选项卡上的事件 我无法在文档中找到它 或者也许有一种未记录的方法 目前似乎没有办法做到这一点 我希望他们添加它
  • 单击系统托盘图标 Python Win32

    环境 我在 Windows 7 64 位上使用 Python 2 7 32 位 我正在使用 win32 Api 来制作一个 Windows 自动化工具 我知道有一些工具存在 但我正在制作自己的工具 Problem 我被困在窗户边系统托盘 通
  • 无法将 com.facebook.share.widget.Sharebutton 添加到布局 XML

    我正在尝试在 Android 中使用 Facebook SDK分享内容 https developers facebook com docs sharing android来自我的应用程序的方向 我从这里开始使用以下代码脸书文档 https
  • 使用Webpack基于环境进行条件构建

    我有一些需要开发的东西 例如模拟 我不想用它来膨胀我的分布式构建文件 在 RequireJS 中 您可以在插件文件中传递配置 并基于该配置有条件地要求内容 对于 webpack 似乎没有办法做到这一点 首先为我使用的环境创建运行时配置解析别
  • Bootstrap网格列清除

    我很难理解 Bootstrap 中的列 ClearFix 结构 我正在尝试创建一个卡片布局 它需要布局中的行都具有相同的高度 但每个条目中的内容不一定相同 您可以在这里查看我正在做的事情的示例 https demo eap soa com
  • Windows Phone 7 麦克风可以检测 18k-19kHz 范围内的频率吗?

    Windows Phone 7 内置麦克风可以检测到高于 18kHz 的频率吗 从技术上讲是的 API 支持以足够的质量记录 PCM 以表达 18kHz 正弦波 标准 POTS 线路甚至 T1 线路通常以 8 kHz 16 位运行 这在数学
  • 我可以在 emacs lisp 宏中添加条件吗?

    如何实现这样的目标 defmacro mood x if equal symbol name x t defun happy message Happy defun sad message Sad 我的目标是根据参数创建不同的函数 这样做有
  • debugger-ruby_core_source gem 没有提供 ruby​​-1.9.2-p321 的源代码

    我最近更新到小牛队 添加了 xcode 的命令行工具 尝试了 捆绑更新调试器 以及我发现的所有其他修复 包括此 rake add source 以包含此处找到的适当标头 http sponsorpay github io blog 2012
  • React-router 和 Next.js 有什么不同

    我目前正在研究 ReactJS 我看见NextJS https nextjs org and 反应路由器 https reacttraining com react router web guides quick start 谁能告诉我两者
  • openid url 列表 [重复]

    这个问题在这里已经有答案了 可能的重复 在哪里可以找到 OpenID 提供商 URL 列表 https stackoverflow com questions 1116743 where can i find a list of openi
  • 将一个元素推送到php中多维数组中的每个数组?

    这是我的数组 myArr array array one two array one two 我想向其中的每个数组添加一个元素 myArr 我不想循环遍历内部的每个数组并添加该元素 有没有更快的方法来实现这一点数组映射 or 数组行走 最好
  • Android 4.x 是否支持通过 TCP 传输 RTSP 流?

    我已经在 Android 中使用 VideoView 在 wowza 上成功播放视频 现在我要处理我的服务器 UDP 端口似乎被阻止 以openRTSP命令证明 gt openRTSP rtsp 61 218 52 250 554 live
  • 使用位图和 Volley 查看寻呼机内存泄漏

    我正在使用 View Pager 在我的应用程序中显示从网络下载的图像 图像的数量可以是 5 到 20 我正在使用 Volley 库来进行网络操作 该应用程序之前并没有占用太多内存 但现在添加视图寻呼机后 该应用程序占用了大量内存 每次我打