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中的内存泄漏的更多相关文章

  1. 处理handler中的内存泄漏

    package de.bvb.test; import android.app.Activity; import android.os.Bundle; import android.os.Handle ...

  2. Java中关于内存泄漏出现的原因以及如何避免内存泄漏

    转账自:http://blog.csdn.net/wtt945482445/article/details/52483944 Java 内存分配策略 Java 程序运行时的内存分配策略有三种,分别是静 ...

  3. Handler系列之内存泄漏

    本篇简单的讲一下平常使用Handler时造成内存泄漏的问题. 什么是内存泄漏?大白话讲就是分配出去的内存,回收不回来.严重会导致内存不足OOM.下面来看一下造成内存泄漏的代码: public clas ...

  4. 系统剖析Android中的内存泄漏

    [转发]作为Android开发人员,我们或多或少都听说过内存泄漏.那么何为内存泄漏,Android中的内存泄漏又是什么样子的呢,本文将简单概括的进行一些总结. 关于内存泄露的定义,我可以理解成这样 没 ...

  5. 了解 JavaScript 应用程序中的内存泄漏

    简介 当处理 JavaScript 这样的脚本语言时,很容易忘记每个对象.类.字符串.数字和方法都需要分配和保留内存.语言和运行时的垃圾回收器隐藏了内存分配和释放的具体细节. 许多功能无需考虑内存管理 ...

  6. JavaScript中的内存泄漏以及如何处理

    随着现在的编程语言功能越来越成熟.复杂,内存管理也容易被大家忽略.本文将会讨论JavaScript中的内存泄漏以及如何处理,方便大家在使用JavaScript编码时,更好的应对内存泄漏带来的问题. 概 ...

  7. 关于Hash集合以及Java中的内存泄漏

    <学习笔记>关于Hash集合以及Java中的内存泄漏 标签: 学习笔记内存泄露hash 2015-10-11 21:26 58人阅读 评论(0) 收藏 举报  分类: 学习笔记(5)  版 ...

  8. [转载]Java应用程序中的内存泄漏及内存管理

    近期发现测试的项目中有JAVA内存泄露的现象.虽然JAVA有垃圾回收的机制,但是如果不及时释放引用就会发生内存泄露现象.在实际工作中我们使用Jprofiler调用java自带的 jmap来做检测还是很 ...

  9. 在 JNI 编程中避免内存泄漏

    JAVA 中的内存泄漏 JAVA 编程中的内存泄漏,从泄漏的内存位置角度可以分为两种:JVM 中 Java Heap 的内存泄漏:JVM 内存中 native memory 的内存泄漏. Java H ...

随机推荐

  1. 重读APUE(12)-SIGCHLD与僵尸进程

    SIGCHLD信号是当子进程终止时向父进程发送的信号:它的语义如下: 如果进程明确的将该信号设置为SIG_IGN,则调用进程不会产生僵尸进程:这种情况下,wait是等不到给子进程收尸的,所以wait阻 ...

  2. @Transactional注解不生效的原因总结(整理网上和自己遇到的解决方案)

    1.问题背景 今天做项目,发现配置好@Transactional后,没有生效,事务没有回滚,即便在网上查资料,也没有解决,好像网上没有人发过我遇见的这种情况的帖子. 2.自己遇到的情况分析 代码结构图 ...

  3. ionic serve 报【ionic-app-scripts' 不是内部或外部命令 】问题解

    Error: Cannot find module 'E:\angular\ionic0515\node_modules\@ionic\app-scripts'    at Function.Modu ...

  4. Python下划线命名模式

  5. JAVA的main方法

    在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方 法有很大的不同,比如方法的名字必须是main,方法必须 ...

  6. javascript-类型、值和变量

    基本类型和引用类型 MDN-JavaScript 数据类型和数据结构 ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值.基本类型值指的是 简单的数据段,而引用类型值指那些 ...

  7. 阿里云服务器怎么用ip访问不了

    个人想做个网站,就买了个阿里云服务器,不得不说阿里的安全做的很好,但是对于我这种小白,就成了麻烦了 工具/原料   阿里云服务器 方法/步骤     首先百度搜索阿里云,进入登录界面,输入账号密码登录 ...

  8. Build Telemetry for Distributed Services之Open Telemetry来历

    官网:https://opentelemetry.io/ github:https://github.com/open-telemetry/ Effective observability requi ...

  9. git撤销某次提交

    1.查询提交记录.进入目录,查看某人在此目录下的commit: panxi@ww-bj-panxi MINGW64 [path]/Business (feature/v2.3) $ git log f ...

  10. 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_15.RabbitMQ研究-与springboot整合-声明交换机和队列

    复制topic的代码 把常量都设置成public方便其他的类引用 ExchangeBuilder里面有4个方法分别对应四个交换机. 声明Email和短信的队列 队列绑定交换机 所以需要把Bean注入到 ...