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();
    

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

  • 相关阅读:
    TensorFlow实战5——TensorFlow实现AlexNet
    TensorFlow实战4——TensorFlow实现Cifar10识别
    TensorFlow实战3——TensorFlow实现CNN
    基础定理推证
    中考几何汇总
    Onenote
    高中数学教材整理
    云盘
    12-27问题
    圆锥曲线(1)
  • 原文地址:https://www.cnblogs.com/wuyida/p/6300481.html
Copyright © 2011-2022 走看看