android Handler vs Timer
Handler vs Timer
在我们Android开发过程中,经常需要执行一些短周期的定时任务,这时候有两个选择Timer或者Handler。然而个人认为: Handler 在多个方面比Timer更为优秀,更推荐使用。
一.易用性
可重复执行 Handler可以重复执行某个任务。 Timer若在某个任务执行/取消之后,再次执行则会抛出一个IllegalStateException异常。为了避免这个异常,需要重新创建一个Timer对象。
周期可调整
若想要执行一个越来越快的定时任务,Handler可以做到,而Timer则消耗较大。 Handler
- private Handler handler = new Handler(); 
 int mDelayTime = 1000;
 private Runnable runnable = new Runnable() {
 public void run() {
 update();
 if (mDelayTime > 0) {
 handler.postDelayed(this,mDelayTime);
 mDelayTime -= 100;
 }
 }
 };
 handler.postDelayed(runnable,1000);
如以上例子,就可以实现对周期的动态调整。 Timer的scheduleAtFixedRate(TimerTask task, long delay, long period)只能执行固定周期的任务,所以不可以动态地调整周期。若想
要动态调整,则需要在执行玩一个定时器任务后,再启动一个新的任务时设置新的时间。
UI界面更新 Handler:在创建的时候可以指定所在的线程,一般在Activity中构建的,即主线程上,所以可以在回调方法中很方便的更新
界面。 Timer:异步回调,所以必须借助Handler去更新界面,不方便。 既然都得用Handler去更新界面了,为何不如把定时的功能也交
给
Handler去做呢?
二.内存占比
Timer比Handler更占内存。接下来的Demo例子通过两种方法循环地打印日志,然后通过MAT插件来查看这两个类所需要调用的对象所产生的
占比。
int mCount = 0;
private void startTimer() {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
Log.i("JKL", "" + mCount);
mCount++;
}
}, 0, 200);
}
private void startHandler() {
final Handler mHandler = new Handler();
mHandler.post(new Runnable() {
@Override
public void run() {
Log.i("JKL", "" + mCount);
mCount++;
mHandler.postDelayed(this, 200);
}
});
}
可以通过创建一个新的Android工程,在onCreate方法中调用以上startTimer或startHandler任意一个方法来测试。以下是MAT的测试结果。
Timer相关对象的内存占比

共有5个对象,占用1192B。Handler相关对象的内存占比

我们可以看到上面有2个Handler,这时候你是否会疑惑呢?其实一个是我们生成的Handler,另外一个是Activity默认生成的,存在于ViewRootImp中,这涉及到ViewTree的知识,此处不便展开。
不过我们可以知道,我们自己构建的Handler,最多也就只占64B。

在使用Handler的时候,还需要用到Runnable,不过也只占了16B。所以,使用Handler的方式来作为定时器,最多也就是80B。
以上可以得出结论,相比起Timer方式的定时器占用1192B,Handler的方式占用资源会小很多,只有1/60。
所以Handler的方式比较节省内存。
写到这里,想到一个点,Timer是创建一个线程去计数的,而Handler是在默认主线程运行的。假若Handler也用一个异步线程去运行,会不会耗很多资源呢?以下是测试代码:
private void startHandler() {
  HandlerThread thread = new HandlerThread("Test");
  thread.start();
  final Handler mHandler = new Handler(thread.getLooper());
  mHandler.post(new Runnable() {
    @Override
    public void run() {
      Log.i("JKL", "" + mCount);
      mCount++;
      mHandler.postDelayed(this, 200);
      }
  });
}
以上用一个HandlerThread来启动一个新的线程。再看看内存占比

以看到HandlerThread也只是占了96B的内存。
综上所述,Handler内存占比低!而且低了不少。
无论从易用性还是内存占比出发,Handler更胜一筹
android Handler vs Timer的更多相关文章
- Android Handler的使用
		大家好我们这一节讲的是Android Handler的使用,在讲Handler之前,我们先提个小问题,就是如何让程序5秒钟更新一下Title. 首先我们看一下习惯了Java编程的人,在不知道Handl ... 
- Android Handler的简单使用
		大家好我们这一节讲的是Android Handler的使用,在讲Handler之前,我们先提个小问题,就是如何让程序5秒钟更新一下Title. 首先我们看一下习惯了Java编程的人,在不知道Handl ... 
- Android Handler 消息处理使用
		本文内容 环境 演示 Handler 消息处理 参考资料 Handler 有两个主要作用或者说是步骤:发送消息和处理消息.在新启动的线程中发送消息,在主线程中获取.并处理消息.Android 平台只允 ... 
- Handler vs Timer,究竟该用哪个?
		Handler vs Timer 在我们Android开发过程中,经常需要执行一些短周期的定时任务,这时候有两个选择Timer或者Handler.然而个人认为:Handler在多个方面比Timer更为 ... 
- iOS中的NSTimer 和 Android 中的Timer
		首先看iOS的, Scheduling Timers in Run Loops A timer object can be registered in only one run loop at a t ... 
- Android Handler leak 分析及解决办法
		In Android, Handler classes should be static or leaks might occur, Messages enqueued on the applicat ... 
- Android Handler练习
		package com.example.myact12; import java.util.Random; import android.support.v7.app.ActionBarActivit ... 
- Android Handler简单使用
		package com.example.myhandlertest3; import android.os.Bundle; import android.os.Handler; import andr ... 
- [Android]Handler的消息机制
		最经面试中,技术面试中有一个是Handler的消息机制,细细想想,我经常用到的Handler无非是在主线程(或者说Activity)新建一个Handler对象,另外一个Thread是异步加载数据,同时 ... 
随机推荐
- 跳转到设置页面 与appstory
			//MARK:系统跳到应用设置页面 func systemMySet(){ let url = NSURL(string: UIApplicationOpenSettingsURLString) if ... 
- Selenium+Python之163邮件发送
			今晚写了一个163邮箱登录的脚本,由于不停的访问163登录主页导致直接访问163邮箱主页登录需要输入验证码,因为无法获取到验证码,就这导致直接访问主页登录脚本不可行,为了绕过验证码,现在先访问hao1 ... 
- pro asp.net mvc5
			mvc 架构的每一个部分都是定义良好和自包含的,称为关注分离.域模型和控制器逻辑与UI是松耦合的.模型中操作数据的逻辑仅包含在模型中,显示数据的逻辑仅包含在视图中,而处理用户请求和用户输入的代码仅包含 ... 
- C#语言之“String.Split”的使用【转】
			String.Split 方法有6个重载函数: 1) public string[] Split(params char[] separator) 2) public string[] Split(c ... 
- Spark Streaming的wordcount案例
			之前测试的一些spark案例都是采用离线处理,spark streaming的流处理一样可以运行经典的wordcount. 基本环境: spark-2.0.0 scala-2.11.0 IDEA-15 ... 
- tensorflow安装相关的
			1 Install pip and Virtualenv sudo apt-get install python-pip python-dev python-virtualenv2 Create a ... 
- 分布式版本控制系统Git-----8.fst-forward与no fast foward
			当前分支合并到另一分支时,如果没有分歧解决,就会直接移动文件指针.这个过程叫做fastforward. 举例来说,开发一直在master分支进行,但忽然有一个新的想法,于是新建了一个develop的分 ... 
- Dubbo.xml配置源-Dubbo.xsd分析
			我们使用Dubbo时,一般都会使用xml配置基本信息,如项目名称(application).注册中心(register).协议(protocal).服务(service),如下所示: 1 2 3 ... 
- android app 集成 信鸽推送
			推送其实挺中意小米推送的,并经用户群占比还是比较大的,奈何拗不过php后端哥们的选型,就只好用信鸽推送了,期间接入过程中也是遇到不少问题,所以记录下来,以后如果还是用信鸽推送的话,估计看看以前的博客, ... 
- 【第一篇】Volley的使用之json请求
			最近项目写完,有开始新的学习了,volley很久以前就接触了,也看了源码,然而却没有通过文章去记录自己的学习成果. 首先讲下volley的特点: 1,扩展性强.Volley 中大多是基于接口的设计,可 ... 
