Android Handler的正确使用

        在Android开发有时候会使用到Handler,但是每次新建一个对象的时候,开发工具都会报一个黄色警告。以前没做过大项目,觉得只要不是Error就可以不关心。但是上次出了一个内存泄露之后,不敢大意了,对于可能出现内存泄露的都需要认真处理下。查了下,这个黄色警告就是因为这样创建Handler有可能会出现内存泄露才报的。所以这里记录一下如何避免创建Handler发生内存泄露。
        正常以前的创建方式是这样的:
        private Handler handler = new Handler(){
                @Overwrite
                public void handMessage(){

                }
        }; 
黄色警告内容如下:
    This Handler class should be static or leaks might occur (anonymous android.os.Handler) less... (Ctrl+F1)
Since this Handler is declared as an inner class, it may prevent the outer class from being garbage collected. If the Handler is using a Looper or MessageQueue for a thread other than the main thread, then there is no issue. If the Handler is using the Looper or MessageQueue of the main thread, you need to fix your Handler declaration, as follows: Declare the Handler as a static class; In the outer class, instantiate a WeakReference to the outer class and pass this object to your Handler when you instantiate the Handler; Make all references to members of the outer class using the WeakReference object.

大致意思就是,这样创建Hanler对象可能会引发内存泄露,应该定义成静态内部类。

解释之前:在Java中非静态内部类和匿名内部类都会隐式拥有外部类的引用,而静态内部类则不会拥有外部类的引用
而Handler为什么会有可能出现内存泄露呢?

是因为当像上面创建Handler的方法一样创建Handler对象的时候,这个Handler被声明为内部类,而它可以拥有外部类的引用。所以当handler定义在activity里面的主线程时候,这个handler就拥有了activity的引用。那么当activity销毁了之后,如果handler关联的主线程的MessageQueue中有一个延时很长时间的Message的时候,因为MessageQueue对象有handler的引用,而handler又有activity的引用,activity是主线程,它又有Message Queue对象的引用,这就会导致Java垃圾回收机制一直回收不了这些内存,就会导致内存泄露。

注意:上面这句”当handler定义在activity里面的主线程时候 “,默认handler是使用activity主线程里面的MessageQueue对象。否则,如果handler在activity中使用自定义的MessageQueue,上面的解释就不正确了。

当在activity中定义handler,并且handler使用的是主线程中MessageQueue的对象时,正确定义handler的方式是:

private static class MyHandler extends Handler {

    private WeakReference<MainActivity> activityWeakReference ;

    public MyHandler(MainActivity activity) {
        activityWeakReference = new WeakReference<MainActivity>(activity) ;
    }

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg) ;
        MainActivity activity = activityWeakReference.get() ;
        if (activity != null) {

        }
    }
}


  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 主线程的 Handler 是一种机制,用于实现将任务在主线程中执行的能力。主线程是 Android 应用程序的主要执行线程,负责处理用户界面的更新和响应用户的输入事件。 在 Android 中,主线程的 Handler 通常用于处理以下情况: 1. 更新 UI:主线程的 Handler 可以接收来自其他线程的消息,并在主线程中更新 UI。如通过 Handler 可以在子线程中进行耗时操作,然后通过 Handler 的 post 方法将结果发送到主线程,在主线程中更新 UI。 2. 延时任务:主线程的 Handler 提供了 postDelayed 方法,可以在指定的延时之后在主线程中执行一个任务。这在 Android 中经常用于实现一些延时操作,比如延时显示一个提示信息,或者延时执行一段代码。 3. 消息处理:主线程的 Handler 可以处理发送给主线程的消息。通过 Handler 的 sendMessage 方法,可以将消息发送到主线程的消息队列中,并通过 handleMessage 方法处理这些消息。这可以用于实现一个简单的消息机制,用于线程之间的通信。 需要注意的是,主线程的 Handler 有一个重要的特性,即只能用于在主线程中创建和使用。这是因为主线程的 Handler 与主线程的 Looper (消息循环器) 相关联,只有在主线程中才能正确地接收和处理消息。 总之,Android 主线程的 Handler 提供了一种方便的机制,用于实现将任务在主线程中执行的能力,并能够与其他线程进行通信和消息处理,使得 Android 应用程序的用户界面能够及时响应用户的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值