Android 优化Handler防止内存泄露

Demo描述:
Handler可能导致的内存泄露及其优化
1 关于常见的Handler的用法但是可能导致内存泄露
2 优化方式请参考BetterHandler和BetterRunnable的实现
package cc.cc;
import java.lang.ref.WeakReference;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
/**
* Demo描述:
* Handler可能导致的内存泄露及其优化
*
* 1 关于常见的Handler的用法但是可能导致内存泄露
* 请参考方法initHandler()
* 2 优化方式请参考BetterHandler和BetterRunnable的实现
*
*
*
*/
public class MainActivity extends Activity {
private Handler mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
/**
* 常见的Handler的用法但是可能导致内存泄露
*
* 比如在旋转屏幕时该Activity重新绘制.
* 但是因为mHandler发送了一个延迟消息,所以消息队列持有mHandler对象
* 又由于new Runnable(){}持有外部类MainActivity的引用
* 所以Activity所占内存并不能向期望的那样被回收,这样就可能会造成内存泄漏.
*
* 这个例子中Handler的延迟时间比较久有20S,有点极端了,一般不会这么干;
* 这里只是为了更好地说明这个问题就这么写代码了。
*
*/
private void initHandler() {
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
// ......doing something
// ......doing something
// ......doing something
// 发送延迟消息
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
}
}, 1000 * 20);
}
/**
* 以下为优化方式
* 1 在此处把BetterHandler和BetterRunnable都设计为静态类,
* 这样它们就不会持有外部类的引用了.
* 2 在BetterHandler中利用WeakReference持有Activity.
* 常听说:"如果一个对象具有弱引用,那么当GC线程扫描的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存"
* 其实准备地说应该是"如果一个对象只具有弱引用.........",即仅有弱引用而不存在对其的强引用才会将其回收.
* 那么此处对Activity采用了弱引用,会不会导致该Activity被回收呢?
* 答案是否定的。因为此处的Activity还在显示界面,当然存在其他对象对它的强引用。所以不会对其回收。
*
* 经过这样的优化,当旋转屏幕时需要销毁原Activity时;消息队列持有Handler对象.但此时Handler对象不再持有Activity的引用.
* 所以系统会回收该Activity所占内存.所以在handleMessage()中处理消息时需要判断Activity是否为空.
* 比如此处20秒后才处理消息 这个时候Activity为空.
*/
private static class BetterHandler extends Handler{
private final WeakReference<Activity> activityWeakReference;
public BetterHandler(Activity activity){
activityWeakReference=new WeakReference<Activity>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (activityWeakReference.get()!=null) {
//.....handle message
} else {
System.out.println("Activity==null");
}
}
}
//同样采用静态内部类
private static class BetterRunnable implements Runnable{
@Override
public void run() {
// ......doing something
}
}
//发送延迟消息
private void sendMessage(){
BetterHandler betterHandler=new BetterHandler(MainActivity.this);
betterHandler.postDelayed(new BetterRunnable(), 1000 * 20);
}
}
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Android
# 优化Handler。Android
# 优化Handler防止内存泄露的方法
# 总结Android App内存优化之图片优化
# Android性能优化之利用强大的LeakCanary检测内存泄漏及解决办法
# 详解Android的内存优化--LruCache
# Android性能优化之利用Rxlifecycle解决RxJava内存泄漏详解
# Android Bitmap详解及Bitmap的内存优化
# 浅谈Android性能优化之内存优化
# 详解Android内存泄露及优化方案
# 详解Android内存优化策略
# Android 内存优化知识点梳理总结
# 请参考
# 对其
# 所占
# 为空
# 时需
# 地说
# 还在
# 如有
# 才会
# 会不会
# 这个问题
# 将其
# 而不
# 希望能
# 采用了
# 这个时候
# 并不能
# 谢谢大家
# 后才
# 如在
相关文章:
赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?
装修招标网站设计制作流程,装修招标流程?
Python文件管理规范_工程实践说明【指导】
黑客如何利用漏洞与弱口令入侵网站服务器?
长沙企业网站制作哪家好,长沙水业集团官方网站?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
建站之星3.0如何解决常见操作问题?
如何通过wdcp面板快速创建网站?
重庆网站制作公司哪家好,重庆中考招生办官方网站?
在线制作视频的网站有哪些,电脑如何制作视频短片?
北京网站制作公司哪家好一点,北京租房网站有哪些?
如何通过WDCP绑定主域名及创建子域名站点?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
定制建站如何定义?其核心优势是什么?
c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】
宝塔面板如何快速创建新站点?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
已有域名建站全流程解析:网站搭建步骤与建站工具选择
如何用AWS免费套餐快速搭建高效网站?
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
建站之星安装后如何自定义网站颜色与字体?
如何正确选择百度移动适配建站域名?
如何在云主机上快速搭建多站点网站?
如何用狗爹虚拟主机快速搭建网站?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
清除minerd进程的简单方法
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
如何在Ubuntu系统下快速搭建WordPress个人网站?
建站之星官网登录失败?如何快速解决?
如何高效配置IIS服务器搭建网站?
怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?
如何在服务器上配置二级域名建站?
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
如何快速生成专业多端适配建站电话?
如何用西部建站助手快速创建专业网站?
常州自助建站工具推荐:低成本搭建与模板选择技巧
如何通过商城自助建站源码实现零基础高效建站?
在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?
香港服务器部署网站为何提示未备案?
实现虚拟支付需哪些建站技术支撑?
php条件判断怎么写_ifelse和switchcase的使用区别【对比】
如何在云主机快速搭建网站站点?
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
如何在万网ECS上快速搭建专属网站?
高性价比服务器租赁——企业级配置与24小时运维服务
广州网站建站公司选择指南:建站流程与SEO优化关键词解析
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
*请认真填写需求信息,我们会在24小时内与您取得联系。