关于handler的内存泄漏的总结

本文深入探讨了Android中Handler的工作原理及可能引发内存泄漏的原因,并提供了解决方案。文章分为三部分:Handler的基本流程、造成内存泄漏的具体场景以及推荐的解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文并非完全是原创,有网络上边的,也有自己的思考与总结,本文主要有三部分来介绍handler的介绍

####第一:熟悉一下handler的流程


##1,当Android程序第一次创建的时候,在主线程同时会由ActivityThread()创建一个Looper对象。Looper实现了一个简单的消息队列,按照事件的顺
序(添加的顺序,还有可能是延迟的事件顺序)一个接着一个处理Message对象.然后添加到Looper的消息队列中,一个一个处理。主线程的Looper存在
整个应用程序的生命周期内(注意这里是整个生命周期)。

##2,当一个Handler对象在主线程中创建的时候,它会关联到Looper的 message queue 。Message添加到消息队列中的时候Message会持有当前Handler引
用,当Looper处理到当前消息的时候,会调用当前类的Handler中的handmessage().

##3,在java中,no-static的内部类会 隐式的 持有当前类的一个引用。static的类则没有。


####第二:什么情况下handler会造成内存的泄露


##1,看代码分析:
public class MyyActivity extends AppCompatActivity {
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new Thread(new Runnable() {
@Override
public void run() {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
System.out.println("我是延迟10分钟后的消息,是在主线程中执行的");
}
}, 60000);
}
}).start();
}

@Override
protected void onDestroy() {
super.onDestroy();
finish();
}
}
当Activity结束后finish(),在 MessageQuence处理这个Message之前,它会持续存活着。这个Message持有Handler的引用,而Handler又持
有Activity(MyyActivity)的引用,这个Activity所有的资源,在这个消息处理之前都不能也不会被回收,所以发生了内存泄露。

####第三:解决办法.


##1,使用静态的内部类在handler的前边加上static,并且加上softweak.并不可取,是因为这样会造成内存的负担,并且software并不可靠.
##2,创建类继承Appalachian,主线程中创建handler,注意使用静态直接的引用即可.

package com.itcast.googleplay.global;
import android.app.Application;
import android.content.Context;
import android.os.Handler;


/**
* $$$$使用继承appalication,并且修改配置程序的入口函数application的onCreate()肯定是先于activity中的oncreate()
* 工具类,模板代码
* Created by Lenovo on 2016/7/27.
*/
public class GooglePlayApplication extends Application {


public static Context context;
/**
* 主线程的消息处理
*/
public static Handler mHandler;


@Override
public void onCreate() {
super.onCreate();
//三大上下文
context = this;
mHandler = new Handler();
//线程创建的消息的方法,一般我们是使用不到子线程的handler的
/*        new Thread(new Runnable() {
@Override
public void run() {
Handler handler = new Handler();
Looper.prepare(); //创建轮询器
Looper.loop();  //开启轮训器
handler.sendEmptyMessage(0);
}
}).start();*/
}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值