java

推荐列表 站点导航

当前位置:首页 > 脚本编程 > java >

java_Android中Handler引起的内存泄露问题解决办法,在Android常用编程中,Handler在

来源:网络整理  作者:  发布时间:2020-12-21 04:56
Android中Handler引起的内存泄露问题解决办法,在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用。...
    super.onCreate(savedInstanceState);

   * reference to their outer class when they are "static".

/**
    }

      public void run() { /* ... */ }

确实上面的代码示例有点难以察觉内存泄露,那么下面的例子就非常明显了

Java:”失效”的private修饰符

   * reference to their outer class.
  protected void onCreate(Bundle savedInstanceState) {

@Override

其实在Android中很多的内存泄露都是由于在Activity中使用了非静态内部类导致的,就像本文提到的一样,所以当我们使用时要非静态内部类时要格外注意,如果其实例的持有对象的生命周期大于其外部类对象,那么就有可能导致内存泄露。个人倾向于使用文章的静态类和弱引用的方法解决这种问题。

  }

// Go back to the previous Activity.
      if (activity != null) {
    }
   * Instances of static inner classes do not hold an implicit
      // ...
    finish();
    }
   */
  };

// Post a message and delay its execution for 10 minutes.

private final MyHandler mHandler = new MyHandler(this);

    finish();
    mHandler.postDelayed(sRunnable, 1000 * 60 * 10);

}

注意上面的new Runnable这里也是匿名内部类实现的,同样也会持有SampleActivity的引用,也会阻止SampleActivity被回收。

    public void handleMessage(Message msg) {

分析一下上面的代码,当我们执行了Activity的finish方法,被延迟的消息会在被处理之前存在于主线程消息队列中10分钟,而这个消息中又包含了Handler的引用,而Handler是一个匿名内部类的实例,其持有外面的SampleActivity的引用,所以这导致了SampleActivity无法回收,进行导致SampleActivity持有的很多资源都无法回收,这就是我们常说的内存泄露。

  }

@Override

  }

  private static class MyHandler extends Handler {

在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用。通常我们的代码会这样实现。

    private final WeakReference<SampleActivity> mActivity;


public class SampleActivity extends Activity {

  private static final Runnable sRunnable = new Runnable() {

复制代码 代码如下:

   * Instances of anonymous classes do not hold an implicit
        // ...
      @Override
      public void run() { /* ... */ }
    @Override

// Post a message and delay its execution for 10 minutes.

/**
}
      @Override

复制代码 代码如下:

@Override
  }
      SampleActivity activity = mActivity.get();
      mActivity = new WeakReference<SampleActivity>(activity);

// Go back to the previous Activity.
   */
    }, 1000 * 60 * 10);

    super.onCreate(savedInstanceState);

public MyHandler(SampleActivity activity) {

private final Handler mLeakyHandler = new Handler() {
  protected void onCreate(Bundle savedInstanceState) {
    public void handleMessage(Message msg) {
      }


    mLeakyHandler.postDelayed(new Runnable() {

要解决这种问题,思路就是不适用非静态内部类,继承Handler时,要么是放在单独的类文件中,要么就是使用静态内部类。因为静态的内部类不会持有外部类的引用,所以不会导致外部类实例的内存泄露。当你需要在静态内部类中调用外部的Activity时,我们可以使用弱引用来处理。另外关于同样也需要将Runnable设置为静态的成员属性。注意:一个静态的匿名内部类实例不会持有外部类的引用。 修改后不会导致内存泄露的代码如下:
public class SampleActivity extends Activity {

相关热词: 解决

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!

本文地址: https://v30.fanwenzhu.com/jiaob/java/6491.shtml

Copyright © www.juheyunku.com      关于 | 合作 | 声明 | 联系 | 更新 | 地图 | Tags

java_Android中Handler引起的内存泄露问题解决办法,在Android常用编程中,Handler在

2020-12-21 编辑:

    super.onCreate(savedInstanceState);

   * reference to their outer class when they are "static".

/**
    }

      public void run() { /* ... */ }

确实上面的代码示例有点难以察觉内存泄露,那么下面的例子就非常明显了

Java:”失效”的private修饰符

   * reference to their outer class.
  protected void onCreate(Bundle savedInstanceState) {

@Override

其实在Android中很多的内存泄露都是由于在Activity中使用了非静态内部类导致的,就像本文提到的一样,所以当我们使用时要非静态内部类时要格外注意,如果其实例的持有对象的生命周期大于其外部类对象,那么就有可能导致内存泄露。个人倾向于使用文章的静态类和弱引用的方法解决这种问题。

  }

// Go back to the previous Activity.
      if (activity != null) {
    }
   * Instances of static inner classes do not hold an implicit
      // ...
    finish();
    }
   */
  };

// Post a message and delay its execution for 10 minutes.

private final MyHandler mHandler = new MyHandler(this);

    finish();
    mHandler.postDelayed(sRunnable, 1000 * 60 * 10);

}

注意上面的new Runnable这里也是匿名内部类实现的,同样也会持有SampleActivity的引用,也会阻止SampleActivity被回收。

    public void handleMessage(Message msg) {

分析一下上面的代码,当我们执行了Activity的finish方法,被延迟的消息会在被处理之前存在于主线程消息队列中10分钟,而这个消息中又包含了Handler的引用,而Handler是一个匿名内部类的实例,其持有外面的SampleActivity的引用,所以这导致了SampleActivity无法回收,进行导致SampleActivity持有的很多资源都无法回收,这就是我们常说的内存泄露。

  }

@Override

  }

  private static class MyHandler extends Handler {

在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用。通常我们的代码会这样实现。

    private final WeakReference<SampleActivity> mActivity;


public class SampleActivity extends Activity {

  private static final Runnable sRunnable = new Runnable() {

复制代码 代码如下:

   * Instances of anonymous classes do not hold an implicit
        // ...
      @Override
      public void run() { /* ... */ }
    @Override

// Post a message and delay its execution for 10 minutes.

/**
}
      @Override

复制代码 代码如下:

@Override
  }
      SampleActivity activity = mActivity.get();
      mActivity = new WeakReference<SampleActivity>(activity);

// Go back to the previous Activity.
   */
    }, 1000 * 60 * 10);

    super.onCreate(savedInstanceState);

public MyHandler(SampleActivity activity) {

private final Handler mLeakyHandler = new Handler() {
  protected void onCreate(Bundle savedInstanceState) {
    public void handleMessage(Message msg) {
      }


    mLeakyHandler.postDelayed(new Runnable() {

要解决这种问题,思路就是不适用非静态内部类,继承Handler时,要么是放在单独的类文件中,要么就是使用静态内部类。因为静态的内部类不会持有外部类的引用,所以不会导致外部类实例的内存泄露。当你需要在静态内部类中调用外部的Activity时,我们可以使用弱引用来处理。另外关于同样也需要将Runnable设置为静态的成员属性。注意:一个静态的匿名内部类实例不会持有外部类的引用。 修改后不会导致内存泄露的代码如下:
public class SampleActivity extends Activity {

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供学习参考!
本文地址为 https://v30.fanwenzhu.com/jiaob/java/6491.shtml

相关文章

风云图片

推荐阅读

返回java频道首页