zoukankan      html  css  js  c++  java
  • Android必知必会-Handler可能引起的内存泄露

    在Android开发中,编写多线程通常会使用到Thread和Handler,细心的朋友会发现,很常见的写法会被编辑器提示有问题,new Handler(){} 内的代码背景颜色会变成黄色。Android Studio的提示大概就是需要定义成静态之类的,以防止内存泄露问题。时间仓促,临时整理一下查到的资料,便于后续使用。
    下面是网上很常见的写法:

    //定义和初始化
    private Handler mhandler=new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                //处理接收到的消息
            }
    };
    
    //下面是调用:
    new Thread(){
          @Override
          public void run() {
              super.run();
              //做一些费时和不允许放在主线程中进行的事情
              //...
              //事情完成后:
              mhandler.sendEmptyMessage(1);
          }
    }.start();

    那么如何解决呢?
    方案一:使用软引用

    //定义和初始化
    WeakReference<Handler> handler = new WeakReference<Handler>(new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                //处理接收到的消息
    });
    
    //下面是调用:
    new Thread(){
          @Override
          public void run() {
              super.run();
              //做一些费时和不允许放在主线程中进行的事情
              //...
              //事情完成后:
              mhandler.get().sendEmptyMessage(1);//调用需要先get
          }
    }.start();

    方案二:自定义静态类

    private static class MHandler extends Handler{
            private Context context;
            public MHandler(Context c){
                context=c;
            }
    
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                //处理接收到的消息
            }
        }
    
    //定义
    private MHandler mHandler;
    
    //初始化
    mHandler = new MHandler(this);
    
    //调用
    new Thread(){
          @Override
          public void run() {
              super.run();
              //做一些费时和不允许放在主线程中进行的事情
              //...
              //事情完成后:
              mhandler.sendEmptyMessage(1);
          }
    }.start();
    

    查到的解决方案都略显麻烦,但能防止不必要的内存泄露,还是多多注意的好。

  • 相关阅读:
    像调试java一样来调试Redis lua
    微言限流
    性能测试遭遇TPS抖动问题
    你所不知道的堆外缓存
    基于JMH的Benchmark解决方案
    基于FastJson的通用泛型解决方案
    你所不知道的日志异步落库
    mac上配置java开发环境
    你所不知道的库存超限做法
    服务器一般达到多少qps比较好[转]
  • 原文地址:https://www.cnblogs.com/wuyida/p/6300481.html
Copyright © 2011-2022 走看看