性能测试工具 Android 内存泄露 (1)—静态引用

Heyniu · 2016年09月14日 · 最后由 securitytest 回复于 2017年09月26日 · 1847 次阅读

静态-ActivityManager-Activity-ClipboardManager

泄露图

问题排查

  • ArticleCommentListActivity 搜索关键字 ActivityManager >> 无果
  • 基类 BaseActivity 搜索 ActivityManager >> 无果
  • 尝试查看引用链 >> 无果
  • 重新打开 ArticleCommentListActivity >> 不作任何操作 >> 关闭页面 >> 无内存泄露
  • 回忆出现内存泄露的步骤 >> 执行过复制操作
  • 重试复制操作 >> 发现内存泄露
  • 定位源码

引用链

源码

case 1:
     ClipboardManager clipboard = (ClipboardManager)
                                  getSystemService(Context.CLIPBOARD_SERVICE);
    /** 替换UBB标签 **/
    String Text = TopicMatcherUtil.ReplaceLabel(commentContent);
    clipboard.setText(String.valueOf(Text));
    UIHelper.makeText(ArticleCommentListActivity.this, "复制成功");
    break;

解决方案

Activity Context 改为 getApplicationContext()

case 1:
     ClipboardManager clipboard = (ClipboardManager)
       this.getApplicationContext().getSystemService(Context.CLIPBOARD_SERVICE);
    /** 替换UBB标签 **/
    String Text = TopicMatcherUtil.ReplaceLabel(commentContent);
    clipboard.setText(String.valueOf(Text));
    UIHelper.makeText(ArticleCommentListActivity.this, "复制成功");
    break;

验证

再次验证,发现无内存泄露,收获 18M 内存

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 12 条回复 时间 点赞

不知道撒意思😂

Heyniu #11 · 2016年09月14日 Author

#1 楼 @lose 不理解什么?

加我微信 seveniruby, 带你到咱们社区的技术微信群.

#3 楼 @seveniruby 我们还有技术微信群?-。=

按理说你这么写简单的调 clipboard 应该不会出内存泄漏啊?
ClipboardManager clipboard 还干么了?
addPrimaryClipChangedListener 还有类似这种的操作?

#6 楼 @yangchengtest 没有了啊,全部代码在这里了

@heyniu 想不明白。。。。
这么说,我只能怀疑是 setText 有问题了。。。setText 持有了 context 的引用,在完成后却没有释放。。。
这个控件没用过,就是看到扫一眼。很有可能不对。。。~~~

public void setPrimaryClip (ClipData clip)
Added in API level 11
Sets the current primary clip on the clipboard. This is the clip that is involved in normal cut and paste operations.
Parameters
clip The clipped data item to set.

public void setText (CharSequence text)
Added in API level 11
This method was deprecated in API level 11.

#8 楼 @yangchengtest 那个引用链太长了 几十条没具体看到底那个引起的
下面这个是我自己写的应用里用的复制

@heyniu this.getApplicationContext() 这个是取 app 启动的 context,这个 context 在 app 死之前不会重新创建。。。所以你这么改肯定不会再有泄漏了,这个是肯定的。
我是觉得就算在普通的 activity 周期里面,不是很奇葩的引用链,应该也不会出问题。~我也是好奇心作怪,😄

#10 楼 @yangchengtest 我也奇怪啊,那个引用链太长了 没全部点开,你看上面就知道了

Heyniu [该话题已被删除] 中提及了此贴 09月26日 12:28
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册