BaseHandler的封装, 处理handler中的内存泄漏
package de.bvb.study.common; /**
* 用于规范 Message.what此属性,避免出现魔法数字
*/
public final class What { public static final int ZERO = 0;
public static final int ONE = 1; /** 标记异步操作返回时目标界面已经消失时的处理状态 */
public static final int ACTIVITY_GONE = -1;
}
package de.bvb.study.common; import android.app.Activity;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment; import java.lang.ref.WeakReference; import de.bvb.study.util.LogUtil; /**
* handler包装类
*/
public abstract class BaseHandler extends Handler { protected WeakReference<Activity> activityWeakReference;
protected WeakReference<Fragment> fragmentWeakReference; private BaseHandler() {}//构造私有化,让调用者必须传递一个Activity 或者 Fragment的实例 public BaseHandler(Activity activity) {
this.activityWeakReference = new WeakReference<>(activity);
} public BaseHandler(Fragment fragment) {
this.fragmentWeakReference = new WeakReference<>(fragment);
} @Override
public void handleMessage(Message msg) {
if (activityWeakReference == null || activityWeakReference.get() == null || activityWeakReference.get().isFinishing()) {
// 确认Activity是否不可用
LogUtil.i("Activity is gone");
handleMessage(msg, What.ACTIVITY_GONE);
} else if (fragmentWeakReference == null || fragmentWeakReference.get() == null || fragmentWeakReference.get().isRemoving()) {
//确认判断Fragment不可用
LogUtil.i("Fragment is gone");
handleMessage(msg, What.ACTIVITY_GONE);
} else {
handleMessage(msg, msg.what);
}
} /**
* 抽象方法用户实现,用来处理具体的业务逻辑
*
* @param msg
* @param what {@link What}
*/
public abstract void handleMessage(Message msg, int what); }
package de.bvb.study.ui.activity; import android.app.Activity;
import android.os.Bundle;
import android.os.Message; import de.bvb.study.common.BaseHandler;
import de.bvb.study.common.What; public class LoginActivity extends BaseActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); new Thread(new Runnable() {
@Override
public void run() {
handler.obtainMessage(What.ZERO, "data 0").sendToTarget();
}
}).start(); new Thread(new Runnable() {
@Override
public void run() {
handler.obtainMessage(What.ONE, "data 1").sendToTarget();
}
}).start(); } MyHandler handler = new MyHandler(this);
private static class MyHandler extends BaseHandler { public MyHandler(Activity activity) {
super(activity);
} @Override
public void handleMessage(Message msg, int what) {
switch (what) {
case What.ZERO:
break;
case What.ONE:
break;
case What.ACTIVITY_GONE:
break;
}
}
}
}
BaseHandler的封装, 处理handler中的内存泄漏的更多相关文章
- 处理handler中的内存泄漏
package de.bvb.test; import android.app.Activity; import android.os.Bundle; import android.os.Handle ...
- Java中关于内存泄漏出现的原因以及如何避免内存泄漏
转账自:http://blog.csdn.net/wtt945482445/article/details/52483944 Java 内存分配策略 Java 程序运行时的内存分配策略有三种,分别是静 ...
- Handler系列之内存泄漏
本篇简单的讲一下平常使用Handler时造成内存泄漏的问题. 什么是内存泄漏?大白话讲就是分配出去的内存,回收不回来.严重会导致内存不足OOM.下面来看一下造成内存泄漏的代码: public clas ...
- 系统剖析Android中的内存泄漏
[转发]作为Android开发人员,我们或多或少都听说过内存泄漏.那么何为内存泄漏,Android中的内存泄漏又是什么样子的呢,本文将简单概括的进行一些总结. 关于内存泄露的定义,我可以理解成这样 没 ...
- 了解 JavaScript 应用程序中的内存泄漏
简介 当处理 JavaScript 这样的脚本语言时,很容易忘记每个对象.类.字符串.数字和方法都需要分配和保留内存.语言和运行时的垃圾回收器隐藏了内存分配和释放的具体细节. 许多功能无需考虑内存管理 ...
- JavaScript中的内存泄漏以及如何处理
随着现在的编程语言功能越来越成熟.复杂,内存管理也容易被大家忽略.本文将会讨论JavaScript中的内存泄漏以及如何处理,方便大家在使用JavaScript编码时,更好的应对内存泄漏带来的问题. 概 ...
- 关于Hash集合以及Java中的内存泄漏
<学习笔记>关于Hash集合以及Java中的内存泄漏 标签: 学习笔记内存泄露hash 2015-10-11 21:26 58人阅读 评论(0) 收藏 举报 分类: 学习笔记(5) 版 ...
- [转载]Java应用程序中的内存泄漏及内存管理
近期发现测试的项目中有JAVA内存泄露的现象.虽然JAVA有垃圾回收的机制,但是如果不及时释放引用就会发生内存泄露现象.在实际工作中我们使用Jprofiler调用java自带的 jmap来做检测还是很 ...
- 在 JNI 编程中避免内存泄漏
JAVA 中的内存泄漏 JAVA 编程中的内存泄漏,从泄漏的内存位置角度可以分为两种:JVM 中 Java Heap 的内存泄漏:JVM 内存中 native memory 的内存泄漏. Java H ...
随机推荐
- python定时任务实现
安装 pip install schedule 示例代码 import schedule import time def job(): print("I'm working..." ...
- Maven:element '******' cannot have character [children]
此错误是由于XML文件的解析不正确造成的,因为在一个/某些标签之间存在奇怪和隐藏的字符. 这些字符可能来自网络上的复制粘贴.要解决此问题,请删除标签>标记定义之间的所有空格和换行符,然后将它们放 ...
- elasticsearch-6.4.3 集群搭建
1.准备三台服务器,已安装好es. 2.修改服务集群配置如下 使用命令: vi elasticsearch.yml 如下: cluster.name: myes ###保证三台服务器节点集群名称相同 ...
- 预编译头文件stdafx.h-stdafx.cpp-stdafx.pch(pre-compile headfile)
tdafx的英文全称为:Standard Application Framework Extensions(标准应用程序框架的扩展). 所谓头文件预编译,就是把一个工程(Project)中使用的一些M ...
- vue-cli项目模板的一些思考
之前有个想法,就是要利用vue写一套ui.然后当时也没有搞清楚到底怎么写. 几经周转吧,通过付费的方式在gitbook上面找到了答案. 找到答案之后再看我们正在开发的项目,看伙伴写的代码,突然发现完全 ...
- 安装vue模板时,选择webpack-simple还是Webpack?
选用模板常用的是webpack与webpack-simple.webpack-simple是基于Webpack@2.1.0-beta.25进行配置的版本,而webpack模板则是基于Webpack ^ ...
- 阿里RDS数据库 全量备份恢复到本地MYSQL
阿里RDS数据库 全量备份恢复到本地MYSQL 1.首先下载RDS的全量备份 下载完成后上传到服务器备用 2.安装MySQL 5.6 首先删除机上其他的MySQL版本 检查系统是否安装其他版本 ...
- C++ STL 已序区间查找算法
#include <iostream>#include <algorithm>#include <list>#include <functional># ...
- SpringBoot学习之一 Unable to find a single main class from the following candidates
在启动SpringBoot项目是报错 Unable to find a single main class from the following candidates [boot.myboot.Sam ...
- python基础--字符串、元组
字符串方法 注:字符串和元组一样都是不可变的,以下函数不会改变原来字符串的值,可以将其赋给一个新的变量 st='a b c d,f,g' st_list=st.split()#字符串分割,参数不写,按 ...