为了账号安全,请及时绑定邮箱和手机立即绑定

哪些Android工具和方法最适合查找内存/资源泄漏?

哪些Android工具和方法最适合查找内存/资源泄漏?

慕标琳琳 2019-07-12 16:23:08
哪些Android工具和方法最适合查找内存/资源泄漏?我已经开发了一个Android应用程序,我的手机应用程序开发的时候,一切看起来都很好,你想宣布胜利和出海,但你知道,那里必须有一些内存和资源泄漏;在Android上只有1600万b堆,而且它显然很容易在Android应用程序中泄漏。我一直在寻找,到目前为止,只能挖掘‘hprof’和‘traceview’的信息,没有得到很多好评。您遇到或开发了哪些工具或方法,并希望在OS项目中共享这些工具或方法?
查看完整描述

3 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

如果您只是使用位图背景,那么@hp.android的答案很好,但是,在我的例子中,我有一个BaseAdapter提供一套ImageViewS代表aGridView..我修改了unbindDrawables()方法,以便条件是:

if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
  ...}

但是问题是,递归方法从不处理AdapterView..为了解决这一问题,我做了以下工作:

if (view instanceof ViewGroup) {
  ViewGroup viewGroup = (ViewGroup) view;
  for (int i = 0; i < viewGroup.getChildCount(); i++)
    unbindDrawables(viewGroup.getChildAt(i));

  if (!(view instanceof AdapterView))
    viewGroup.removeAllViews();}

使孩子们AdapterView仍然被处理-该方法只是不尝试删除所有的子级(这是不支持的)。

然而,这并不能完全解决这个问题,因为ImageViewS管理一个不是他们背景的位图。因此,我补充如下。这并不理想,但有效:

if (view instanceof ImageView) {
  ImageView imageView = (ImageView) view;
  imageView.setImageBitmap(null);}

总体上unbindDrawables()方法是:

private void unbindDrawables(View view) {
  if (view.getBackground() != null)
    view.getBackground().setCallback(null);

  if (view instanceof ImageView) {
    ImageView imageView = (ImageView) view;
    imageView.setImageBitmap(null);
  } else if (view instanceof ViewGroup) {
    ViewGroup viewGroup = (ViewGroup) view;
    for (int i = 0; i < viewGroup.getChildCount(); i++)
    unbindDrawables(viewGroup.getChildAt(i));

    if (!(view instanceof AdapterView))
      viewGroup.removeAllViews();
  }}

我希望有一个更有原则的方法来释放这些资源。


查看完整回答
反对 回复 2019-07-12
  • 3 回答
  • 0 关注
  • 467 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信