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. docker 部署 .net core

    1.centos安装好sdk2.1,安装好docker,这些基本的操作就不赘述. 2.准备好core项目,版本2.1 3.新建dockerfile文件放到项目发布文件夹里,里面内容如下: FROM m ...

  2. sqlserver 锁表进程及执行的SQL

    --1.查进程select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableNamefrom sys.d ...

  3. Flutter点击两次返回键退出APP

    在APP中一些页面为了防止用户操作失误点击到返回键导致退出APP,可以设置其一定时间内点击两次返回键才允许退出APP,完成这个功能可以通过WillPopScope和SystemNavigator.po ...

  4. spring 事务-使用@Transactional 注解(事务隔离级别)

    转: spring 事务-使用@Transactional 注解(事务隔离级别) 2016年08月11日 21:49:20 华华鱼 阅读数 15490 标签: spring事务Transactiona ...

  5. 16 Flutter仿京东商城项目 跳转到搜索页面实现搜索功能 以及搜索筛选

    ProductList.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.dart'; imp ...

  6. 13 Flutter仿京东商城项目 商品列表筛选以及上拉分页加载更多

    ProductList.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.dart'; imp ...

  7. socket编程之黏包

    原理概述 上图是我在学习python的socket编程中遇到的黏包问题所画,以实例来说明这个高大上的黏包问题. 我们知道socket()实例中sendall()方法是无论数据有多大,一次性提交写入缓冲 ...

  8. [PyTorch] Facebook Research - Mask R-CNN Benchmark 的安装与测试

    Github项目链接:https://github.com/facebookresearch/maskrcnn-benchmark maskrcnn_benchmark 安装步骤: 安装Anacond ...

  9. 在java web 工程中实现登录和安全验证

    登录验证代码 package security; import java.io.IOException; import javax.servlet.ServletException; import j ...

  10. nodejs nvm npm常用命令

    ---恢复内容开始--- 一行命令搞定node.js 版本升级 node有一个模块叫n(这名字可够短的...),是专门用来管理node.js的版本的. 首先安装n模块: npm install -g ...