android 无限循环 简书,Android Handler 解决循环引用
案例
public class MainActivity extends AppCompatActivity {
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
...
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
...
}
}, 1000000);
}
}
(1)外部类Activity中定义了一个非静态内部类Handler,非静态内部类默认持有对外部类的引用。如果外部Activity突然关闭了,但是MessageQueue中的消息还没处理完,那么Handler就会一直持有对外部Activty的引用,垃圾回收器无法回收Activity,从而导致内存泄漏。
(2) 如上代码,在postDelayed中,我们在参数中传入一个非静态内部类Runnable,这同样会造成内存泄漏,假如此时关闭了Activity,那么垃圾回收器在接下来的1000000ms内都无法回收Activity,造成内存泄漏。
解决方案:
(1) 将非静态内部类Handler和Runnable转为静态内部类,因为非静态内部类(匿名内部类)都会默认持有对外部类的强引用。
(2) 改成静态内部类后,对外部类的引用设为弱引用,因为在垃圾回收时,会自动将弱引用的对象回收。
public class HandlerActivity extends AppCompatActivity {
private final MyHandler mHandler = new MyHandler(this);
private static final Runnable mRunnable = new Runnable() {
@Override
public void run() {
// 操作
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fourth);
mHandler.postDelayed(mRunnable, 1000*10);
finish();
}
private static class MyHandler extends Handler {
WeakReference mWeakActivity;
public MyHandler(HandlerActivity activity) {
this.mWeakActivity = new WeakReference(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
final HandlerActivity mActivity = mWeakActivity.get();
if (mActivity != null) {
// 处理消息
}
}
}
}
android 无限循环 简书,Android Handler 解决循环引用相关推荐
- android自动登录简书,Android开发之简单登录界面
用户界面基础 Android系统的四大组件分别是活动(Activity).服务(Service).广播接收器(Broadcast Receiver).内容提供器(Content Provider). ...
- android 读写文件 简书,Android 中的文件操作
Android 文件操作 概述 Android 中的文件操作主要涉及到两个部分,一个是内部存储的读写,一个是外部存储的读写两者的主要区别如下表: 内部存储 外部存储 始终可用 它并非始终可用,因为用户 ...
- android运行过程简书,Android系统的启动流程
Android系统有哪些进程 在Linux系统启动时,会读取init.rc,里面配置了一些需要启动的进程.注意:SystemServer进程不在init.rc里,因为SystemServer进程是由z ...
- android波浪动画简书,Android贝塞尔曲线————波浪效果(大波浪)
Hello大家好,很高兴又一次与大家见面,今天是农历丁酉鸡年(大年初四),现在跟大家拜年有点晚,算是拜晚年,祝大家晚年幸福. 这么快大伙都到了晚年了,Android贝塞尔曲线我也准备以一个大波浪来结束 ...
- android 开发环境简书,Android Studio 开发环境快速搭建
目录 - 1.下载JDK.AS - 1.1 JDK下载 - 1.2 AS下载 - 1.3 百度云资源统一下载 - 2.安装JDK - 3.配置JDK及JAVA的环境 - 3.1 打开系统环境 - 3. ...
- android 辅助服务 简书,Android AccessibilityService使用
测试demo主要使用了Android 的无障碍辅助服务(AccessibilityService),主要注意是 1. 开启服务,绑定目标app的监听(demo中根据包命绑定了体积计算的app),需要在 ...
- android四大组件 简书,android四大组件
android有四大组件,分别是Activity, Service(服务),Content Provider(内容提供者),BoadcastReceiver广播接收器. Activity 一个Acti ...
- android 存储方式简书,Android的多种数据存储方式
1. 简介 作为一个完整的应用程序,数据存储操作是必不可少的.现在Android的离线缓存就是通过网络良好状态时将从服务器收到的数据保存到本地.Android系统中主要提供了3种方式进行数据存储,分别 ...
- android权限适配 简书,Android动态权限适配
最近APP里面要添加动态权限,网上找了不少例子并经过一定的测试,基本流程有了一定的认识,需要注意的地方记录下来以备以后查阅. 一 各大手机厂商的适配 依据各大手机Rom的不同表现,可以分为三种不同的模 ...
最新文章
- Go 分布式学习利器(15) -- Go 实现 深搜和广搜
- 使用Rancher管理Docker
- 使用群集保障SQL Server 2005的高可用性(2)
- 用 Fiddler 来弥补 Chrome Network 的小缺点
- hyperopt中文文档:Installation-Notes安装说明
- python3精要(5)-python表达式操作符(2)
- boost::container实现emplace进位的程序
- Android 4.0新增WiFiDirect功能
- 【移动开发】安卓Lab2(02)
- 【渝粤教育】国家开放大学2018年秋季 0717-22T社会保障基础 参考试题
- Android camera开发(9)---Dual Camera(MTK solution)开案说明
- 怎么一秒钟给微信头像戴上圣诞帽,我教你啊
- php正则表达式中的字符是,PHP_PHP正则表达式中的特殊字符,字符/意义:对于字符,通常表 - phpStudy...
- android得到assets下面的资源
- Python写一个服务
- 无人机——凤凰模拟器篇(五)遥控器的配置教程
- 第一次发博客,随便说说
- 无法导入C:\Users\Administrator\Desktop\***.reg:未将所有数据都成功写入到注册表中。某些项是由系统或其他进程打开的,或者你没有足够的权限执行此操作。
- 微风:什么样的人适合学习UI设计?
- 修改虚拟机的ip地址步骤
热门文章
- 问:为什么python中有了全局解释器锁GIL,还要有互斥锁?
- Re-Order Buffer
- 领域驱动设计-基本概念
- Mac下 javac java 进行编译和运行含有包路径及引入jar包的类
- Mysql中添加汉字乱码无法识别问题
- POJ 3308 Paratroopers (对数转换+最小点权覆盖)
- 分享50佳高质量免费按钮图标资源(上篇)[zz]
- ASP.NET URL编码处理
- VS2010 书签 工具的使用方法
- 大数据之-Hadoop3.x_MapReduce_CombineTextInputFormat---大数据之hadoop3.x工作笔记0108