Android 优化Handler防止内存泄露
发布时间 - 2026-01-11 03:05:43 点击率:次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 内存优化知识点梳理总结
# 请参考
# 对其
# 所占
# 为空
# 时需
# 地说
# 还在
# 如有
# 才会
# 会不会
# 这个问题
# 将其
# 而不
# 希望能
# 采用了
# 这个时候
# 并不能
# 谢谢大家
# 后才
# 如在
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
如何用PHP快速搭建高效网站?分步指南
Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程
Laravel如何集成Inertia.js与Vue/React?(安装配置)
想要更高端的建设网站,这些原则一定要坚持!
网站制作报价单模板图片,小松挖机官方网站报价?
EditPlus中的正则表达式 实战(4)
Android 常见的图片加载框架详细介绍
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
如何在万网ECS上快速搭建专属网站?
Laravel如何配置Horizon来管理队列?(安装和使用)
Laravel如何与Inertia.js和Vue/React构建现代单页应用
html如何与html链接_实现多个HTML页面互相链接【互相】
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
如何在七牛云存储上搭建网站并设置自定义域名?
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
Laravel如何配置任务调度?(Cron Job示例)
简单实现jsp分页
Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程
Laravel Docker环境搭建教程_Laravel Sail使用指南
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】
香港网站服务器数量如何影响SEO优化效果?
Firefox Developer Edition开发者版本入口
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能
香港服务器租用费用高吗?如何避免常见误区?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
敲碗10年!Mac系列传将迎来「触控与联网」双革新
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
个人摄影网站制作流程,摄影爱好者都去什么网站?
制作旅游网站html,怎样注册旅游网站?
谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复
如何在景安云服务器上绑定域名并配置虚拟主机?
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
Android okhttputils现在进度显示实例代码
Laravel如何处理文件下载请求?(Response示例)
JavaScript实现Fly Bird小游戏
VIVO手机上del键无效OnKeyListener不响应的原因及解决方法
如何撰写建站申请书?关键要点有哪些?
Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
如何破解联通资金短缺导致的基站建设难题?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
如何挑选优质建站一级代理提升网站排名?
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
Laravel如何实现用户密码重置功能?(完整流程代码)
Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
,交易猫的商品怎么发布到网站上去?

