Android 防内存泄露handler

1.使用弱引用 WeakRefHander

    /**
* 作者: allen on 15/11/24.感谢开源作者https://coding.net/u/coding/p/Coding-Android/git
*/ /**
* 弱引用 handler 防止内存泄露
*/
public class WeakRefHander extends Handler { private final WeakReference<Handler.Callback> mRef;
private final int mLoopTime;
private int NO_LOOP = -1;
private int what =0; /**
* 循环
*
* @param loopAction
* @param loopTime
*/
public WeakRefHander(Handler.Callback loopAction, int loopTime) {
super();
this.mRef = new WeakReference<>(loopAction);
this.mLoopTime = loopTime; } /**
* 不循环
*
* @param loopAction
*/
public WeakRefHander(Handler.Callback loopAction) {
super();
mRef = new WeakReference<>(loopAction);
mLoopTime = NO_LOOP;
} @Override
public void handleMessage(Message msg) {
Handler.Callback action = mRef.get();
if (action != null) {
action.handleMessage(msg);
if (mLoopTime != NO_LOOP) {
sendEmptyMessageDelayed(what, mLoopTime);
}
}
} public void start() {
removeMessages(0);
sendEmptyMessageDelayed(0, 0);
} public void start(int what, long delay) {
this.what = what;
removeMessages(what);
sendEmptyMessageDelayed(what, delay);
} public void stop() {
removeMessages(what);
} public void clear() {
removeMessages(what);
mRef.clear();
}
}

2. 实现 Activity implements WeakRefHander.Callback

3. 在handleMessage处理业务逻辑

演示样例代码:

    public class MainActivity extends AppCompatActivity implements WeakRefHander.Callback {
private WeakRefHander weakRefHander;
private static final int HANDLER_MESSAGE_START = 1001;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
weakRefHander = new WeakRefHander(this, 1);
weakRefHander.start(HANDLER_MESSAGE_START, 1000 * 30);
} @Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case HANDLER_MESSAGE_START:
//Todo 处理业务逻辑
break;
default:
break;
}
return true;
} @Override
public void onResume() {
super.onResume();
weakRefHander.start();
} @Override
public void onPause() {
weakRefHander.stop();
super.onPause();
} @Override
protected void onDestroy() {
weakRefHander.clear();
super.onDestroy();
}
}

-Github演示样例參考代码

參考作者:-Coding-Android作者

Android 防内存泄露handler的更多相关文章

  1. Android App 内存泄漏Handler

    Android App 内存泄露之Handler Handler也是造成内存泄露的一个重要的源头,主要Handler属于TLS(Thread Local Storage)变量,生命周期和Activit ...

  2. Android 的内存泄露和内存限制

    转载自 https://blog.csdn.net/goodlixueyong/article/details/40716779 https://blog.csdn.net/vshuang/artic ...

  3. Android 常见内存泄露 & 解决方案

    前言 内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃 (OOM) 等严重后果. 那什么情况下不能被 ...

  4. Android App 内存泄露之调试工具(1)

    Android App 内存泄露之工具(1) 使用内存监測工具 DDMS –> Heap 操作步骤 启动eclipse后,切换到DDMS透视图,并确认Devices视图.Heap视图都是打开的, ...

  5. 关于Android 的内存泄露及分析

    一. Android的内存机制Android的程序由Java语言编写,所以Android的内存管理与Java的内存管理相似.程序员通过new为对象分配内存,所有对象在java堆内分配空间:然而对象的释 ...

  6. 如何用MAT分析Android应用内存泄露

    使用工具:Android Studio 2.0 Preview, Android Device Monitor, MAT(Memory Analyzer). 点击Android Studio工具栏上的 ...

  7. 【转】.. Android应用内存泄露分析、改善经验总结

    原文网址:http://wetest.qq.com/lab/view/107.html?from=ads_test2_qqtips&sessionUserType=BFT.PARAMS.194 ...

  8. Android之内存泄露、内存溢出、内存抖动分析

      内存   JAVA是在JVM所虚拟出的内存环境中运行的,内存分为三个区:堆.栈和方法区.栈(stack):是简单的数据结构,程序运行时系统自动分配,使用完毕后自动释放.优点:速度快.堆(heap) ...

  9. Android常见内存泄露,学会这六招优化APP性能

    很多开发者都知道,在面试的时候会经常被问到内存泄露和内存溢出的问题. 1.内存溢出(Out Of Memory,简称 OOM),通俗理解就是内存不够,即内存占用超出内存的空间大小. 2.内存泄漏(Me ...

随机推荐

  1. ASP.NET Core 2.0 集成测试无法执行的问题

    问题表现: Microsoft.AspNetCore.Mvc.Razor.Compilation.CompilationFailedException : One or more compilatio ...

  2. 网页静态化技术Freemarker的详细介绍

    网页静态化技术Freemarker 一.Freemarker的基本介绍 1.1为什么要使用网页静态化技术 网页静态化解决方案在实际开发中运用比较多,例如新闻网站,门户网站中的新闻频道或者是文章类的频道 ...

  3. Java并发Fork-Join框架原理解析

    1.什么是Foirk/Join框架 Fork/Join框架是Java7提供用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架. 2.什么是并行流与顺 ...

  4. Java--Socket通信(双向)

    新建两个工程,一个客户端,一个服务端,先启动服务端再启动客户端两个工程的读写操作线程类基本上完全相同 服务端: import java.io.BufferedReader; import java.i ...

  5. Datatbel和 string之间的相互转换

     Datatable 到 string public static string DataTableToString(DataTable dt)        {            //!@&am ...

  6. SimpleMembership

    最近2个月以来,一直在学习MVC,从最开始的2,一直到最新的4.从原来的aspx到现在的Razor引擎,越学越开心,越学越上瘾. 最近为新项目做准备,打算用MVC4,VS2012+SQL2012,反正 ...

  7. [转载] Jupiter代码审查工具使用参考

    转载自http://blog.csdn.net/jemlee2002/article/details/5715355 一.       Jupiter 是什么? 这里的 Jupiter 是一个开源的代 ...

  8. 基于MyBatis的数据服务接口

    背景 作为软件系统开发,数据操作是系统开发不可避免的一个重要组成部分.因为其重要性围绕着数据操作也出现了众多框架.成熟框架是为了普适众多数据操作要求的,因此为了更好的实现技术落地,需要对框架进行丰富和 ...

  9. [转]Android应用安装包apk文件的反编译与重编译、重签名

    背景介绍: 最近在做Robotium自动化测试,使用到solo.takeScreenshot()函数以在测试过程中截图,但此函数需要被测试APP具有<uses-permission androi ...

  10. GameObject类及相关API

    GameObject.Find(String name):查找一个名为name的游戏物体,并返回这个游戏物体,找不到返回null.(不到万不得已,不要在Update()中使用,建议在Start()中使 ...