Handler在android程序开发中使用的很是频繁、咱们知道android是不容许在子线程中更新UI的,这就须要借助Handler来实现,那么你是否想过为何必定要这个这样子作呢?并且Handler的内部消息处理机制到底是什么样的呢,咱们了解了以后还能够作点什么事?带着这些疑问我系统的学习了一个讲解Handler原理的课程,今天就在这里将本身的学习收获总结下来。毕竟好记性不如烂笔头,想学会跑就必须先学会好好走路。在总结的时候确实很头疼,由于Handler的原理是须要经过源代码才能说的清楚的,并且它处理机制比较复杂,一时不知道该从哪里提及。想来想去,就先从Handler的几个简单的使用方法开始吧,并且在总结过程当中为了方便之后快捷的查阅使用,尽可能说的精炼,不牵涉到源码的追踪和解析。android
1、Handler是什么数组
Handler是android.os包下的一个消息处理的类。
app
本身写代码的时候也将常常使用到Handler,可是对于Handler到底是什么,还真说不出个因此然。Handler究竟是什么呢?以下:post
Handler是android为咱们封装的一套消息处理的机制,也是一套子线程用来更新UI的机制
所以,能够知道,Handler能够作两件事,第一能够在子线程中更新UI,第二能够用来处理消息。下面咱们就利用Handler的API,举一个简单的小例子,来看一看Handler是怎么处理消息和更新UI的。学习
2、Handler使用的l一个小例子以及相应的方法总结spa
(1)模拟图片轮播效果
线程
你们在点击淘宝的时候确定遇到过淘宝为你推荐商品的状况,并且推荐的图片会快速的一张接一张的不断的更换。如今咱们就用Handeler中的postDelayed方法来简单模拟这样子的一个图片轮播的效果。你们能够翻看源码的注释,这个方法是用来延迟发送一个Runnable实例的,也就是延迟执行该Runnable里的run方法。code
首先你要准备三张图片(请读者自行准备),而后新建项目“HandlerTest”,在其activity_main.xml中写入以下代码:xml
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 > 6 7 <ImageView 8 android:id="@+id/imgview" 9 android:layout_width="wrap_content" 10 android:layout_height="wrap_content" 11 android:src="@drawable/ali"/> 12 13 </LinearLayout>
代码很简单,就是放置了一个ImageView用来显示图片而已。而后在MainActivity中写入下面的代码:对象
1 package com.example.handldertest; 2 3 import android.os.Bundle; 4 import android.os.Handler; 5 import android.widget.ImageView; 6 import android.app.Activity; 7 8 9 public class MainActivity extends Activity { 10 11 private ImageView img; 12 //实例化图片数组,存放的是他们的id 13 private int[] imgs = {R.drawable.ali,R.drawable.girl,R.drawable.q}; 14 private int index = 0; 15 16 private Handler mHandler = new Handler(); 17 private MyRunnable mr = new MyRunnable(); 18 19 class MyRunnable implements Runnable{ 20 21 public void run() { 22 index++; 23 index = index%3; 24 25 img.setImageResource(imgs[index]); 26 27 mHandler.postDelayed(mr, 1000); 28 29 } 30 31 } 32 33 protected void onCreate(Bundle savedInstanceState) { 34 super.onCreate(savedInstanceState); 35 setContentView(R.layout.activity_main); 36 img = (ImageView) findViewById(R.id.imgview); 37 38 mHandler.postDelayed(mr, 1000); 39 } 40 41 }
而后咱们是怎么首先图片轮播的呢?其实很简单,咱们在主线程中postDelayed一个mr对象,而后再在mr对象的run方法中,然它将本身再postDelayed,这样子它就无限循环下去了。那么run方法也就无限循环了,咱们只要在run方法中执行ImageView的图片显示逻辑便可。运行程序,效果以下图:
(2)Handler经常使用的一个方法小结
相信这些方法你们都不会感到陌生,在Handler的API中都是能够查阅到的。现小结以下:
postDelayed(Runnable r, long delayMillis) 延迟多少秒后直接会执行Runnable里的run方法sendEmptyMessage(int what) 直接发送一个只包含what字段的消息
sendMessage(Message msg) 发送一个Message对象
removeCallbacks(Runnable r) 从Handler中移除一个Runnable对象
removeMessages(int what)
从Handler中移除一个what字段的消息
sendEmptyMessage(int what) 直接发送一个只包含what字段的消息sendMessage(Message msg) 发送一个Message对象
sendMessage(Message msg) 发送一个Message对象removeCallbacks(Runnable r) 从Handler中移除一个Runnable对象
removeMessages(int what)
从Handler中移除一个what字段的消息removeCallbacks(Runnable r) 从Handler中移除一个Runnable对象
removeCallbacks(Runnable r) 从Handler中移除一个Runnable对象removeMessages(int what)
从Handler中移除一个what字段的消息removeMessages(int what)
从Handler中移除一个what字段的消息removeMessages(int what)
上面的方法的使用应该是很熟悉的了,由于常常用到,就很少举例子了,更多的方法能够查找API文档。把重点放在Handler的消息处理机制的总结上。这是下一篇文章所要作的内容。