Android基础--Handler的使用简单介绍
2016-05-29 00:45
489 查看
一、Handler的作用:
1.在新启动的线程中发送消息
2.在主线程中获取,处理消息
一句话:接受子线程发送的数据, 并用此数据配合主线程更新UI。
解释:当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件, 进行事件分发, 比如说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作。 如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到Android系统的一个错误提示 “强制关闭”。 这个时候我们需要把这些耗时的操作,放在一个子线程中。更新UI只能是主线程的工作,子线程更新UI是线程不安全的,所以android里非主线程操作主UI就会报错。霸道一点就是:android就限定了只有主线程可以操作UI。子线程想操作UI,可以,你告诉我(主线程),我来更新。 这个时候,Handler就出现了,来解决这个复杂的问题 ,由于Handler运行在主线程中(UI线程中), 它与子线程可以通过Message对象来传递数据, 这个时候,Handler就承担着接受子线程传过来的Message对象(里面包含数据) , 把这些消息放入主线程队列中,配合主线程进行更新UI。
二、Handler一些特点
handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),它有两个作用:
(1)安排消息或Runnable 在某个主线程中某个地方执行;
(2)安排一个动作在不同的线程中执行。
Handler中分发消息的一些方法
post(Runnable r)
postDelayed(Runnable r, long delayMillis)
sendEmptyMessage(int what)
sendEmptyMessageDelayed(int what,long delayMillis)
sendMessage(Message msg)
sendMessageDelayed(Message msg,long delayMillis)
以上post类方法允许你排列一个Runnable对象到主线程队列中,
sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新。
下面我们先说下
post(Runnable r)
postDelayed(Runnable r, long delayMillis)
这两个方法中的参数,只是其中一个多了delayMillis毫秒数,也就是延迟多少毫秒发送消息。
请看下面的一张图片,我们现在通过postDelayed来实现这个效果:
![](http://img.blog.csdn.net/20160530141324997)
首先,我们要有个上图的xml布局,布局很简单,我这里就不再提供,在性别和生日加了id.在代码里面我们要添加这2个触摸事件,点击姓名控件的时候弹出生日控件,触摸生日控件的时候弹出地址控件。
上代码:
上面的代码实现的很简单,我简单的介绍一下,定义sex和birthday的触摸事件,在onTouch里面我们我们用handler的postDelayed方法。实现对ScrollView的高度改变。这个时候,也许你会问,为什么只发送了消息,没有接收处理消息啊,这个就需要看postDelayed的源码了,他已经实现了接收和处理的全部功能。具体的话,你们可以查看源码去进一步了解。
下面我们来看下
sendMessage(Message msg)
sendMessageDelayed(Message msg,long delayMillis)
我们已一个倒计时的例子来讲解,我们一般在获取手机验证码的时候会用到,那么我们来看下图片效果:
![](http://img.blog.csdn.net/20160530155504600)
看下代码吧:
最后一个
sendEmptyMessage(int what)
sendEmptyMessageDelayed(int what,long delayMillis)
这个一看参数就知道,传的是空消息,不需要传递什么数据,这个就没有什么好说的了。
以上就是我总结的Handler的用法,欢迎大家吐槽,有问题,请大家给予指正,谢谢!!
1.在新启动的线程中发送消息
2.在主线程中获取,处理消息
一句话:接受子线程发送的数据, 并用此数据配合主线程更新UI。
解释:当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件, 进行事件分发, 比如说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作。 如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到Android系统的一个错误提示 “强制关闭”。 这个时候我们需要把这些耗时的操作,放在一个子线程中。更新UI只能是主线程的工作,子线程更新UI是线程不安全的,所以android里非主线程操作主UI就会报错。霸道一点就是:android就限定了只有主线程可以操作UI。子线程想操作UI,可以,你告诉我(主线程),我来更新。 这个时候,Handler就出现了,来解决这个复杂的问题 ,由于Handler运行在主线程中(UI线程中), 它与子线程可以通过Message对象来传递数据, 这个时候,Handler就承担着接受子线程传过来的Message对象(里面包含数据) , 把这些消息放入主线程队列中,配合主线程进行更新UI。
二、Handler一些特点
handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),它有两个作用:
(1)安排消息或Runnable 在某个主线程中某个地方执行;
(2)安排一个动作在不同的线程中执行。
Handler中分发消息的一些方法
post(Runnable r)
postDelayed(Runnable r, long delayMillis)
sendEmptyMessage(int what)
sendEmptyMessageDelayed(int what,long delayMillis)
sendMessage(Message msg)
sendMessageDelayed(Message msg,long delayMillis)
以上post类方法允许你排列一个Runnable对象到主线程队列中,
sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新。
下面我们先说下
post(Runnable r)
postDelayed(Runnable r, long delayMillis)
这两个方法中的参数,只是其中一个多了delayMillis毫秒数,也就是延迟多少毫秒发送消息。
请看下面的一张图片,我们现在通过postDelayed来实现这个效果:
首先,我们要有个上图的xml布局,布局很简单,我这里就不再提供,在性别和生日加了id.在代码里面我们要添加这2个触摸事件,点击姓名控件的时候弹出生日控件,触摸生日控件的时候弹出地址控件。
上代码:
package com.fshsoft.handlerdemo1; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.widget.EditText; import android.widget.ScrollView; public class MainActivity extends AppCompatActivity implements View.OnTouchListener { private ScrollView scrollView; private EditText sex; private EditText birthday; private int height; private Handler handler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); scrollView = (ScrollView) findViewById(R.id.scrollView); sex = (EditText) findViewById(R.id.sex); birthday = (EditText) findViewById(R.id.birthday); sex.setOnTouchListener(this); birthday.setOnTouchListener(this); } private void changeScrollView(){ handler.postDelayed(new Runnable() { @Override public void run() { scrollView.scrollTo(0,height+=100); } },300); } @Override public boolean onTouch(View v, MotionEvent event) { switch (v.getId()){ case R.id.sex: changeScrollView(); break; case R.id.birthday: changeScrollView(); break; } return false; } }
上面的代码实现的很简单,我简单的介绍一下,定义sex和birthday的触摸事件,在onTouch里面我们我们用handler的postDelayed方法。实现对ScrollView的高度改变。这个时候,也许你会问,为什么只发送了消息,没有接收处理消息啊,这个就需要看postDelayed的源码了,他已经实现了接收和处理的全部功能。具体的话,你们可以查看源码去进一步了解。
下面我们来看下
sendMessage(Message msg)
sendMessageDelayed(Message msg,long delayMillis)
我们已一个倒计时的例子来讲解,我们一般在获取手机验证码的时候会用到,那么我们来看下图片效果:
看下代码吧:
package com.fshsoft.handlerdemo2; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.TextView; import java.util.Timer; import java.util.TimerTask; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private TextView getCode; private Timer timer; private TimerTask timerTask; private int i = 10;//定义倒计时10秒 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getCode = (TextView) findViewById(R.id.getCode); getCode.setOnClickListener(this); } @Override public void onClick(View v) { startTime(); } private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) {//获取消息,并处理消息,更改UI界面 if(msg.arg1==0){ stopTime(); getCode.setText("重新获取"); i = 10; }else{ getCode.setText(msg.arg1+"秒"); startTime(); } } }; /** * 开始倒计时 */ public void startTime(){ timer = new Timer(); timerTask = new TimerTask() { @Override public void run() { Message msg = handler.obtainMessage(); //Message message = new Message();这个new出的Message,和上面的获取Message对象是一样的,大家通过源码就可以看到 msg.arg1 = i; handler.sendMessage(msg);//发送消息 i--; } }; timer.schedule(timerTask,1000); } /** * 倒计时结束 */ public void stopTime(){ timer.cancel(); } }
最后一个
sendEmptyMessage(int what)
sendEmptyMessageDelayed(int what,long delayMillis)
这个一看参数就知道,传的是空消息,不需要传递什么数据,这个就没有什么好说的了。
以上就是我总结的Handler的用法,欢迎大家吐槽,有问题,请大家给予指正,谢谢!!
相关文章推荐
- GUI - Web前端开发框架
- 评价ui设计作品好坏的八个标准(界面/交互设计研究)
- C#线程间不能调用剪切板的解决方法
- Jquery ui datepicker设置日期范围,如只能隔3天【实现代码】
- C#线程同步的三类情景分析
- C#获取进程或线程相关信息的方法
- 简单对比C#程序中的单线程与多线程设计
- C#停止线程的方法
- C#子线程更新UI控件的方法实例总结
- C#线程队列用法实例分析
- 为Yahoo! UI Extensions Grid增加内置的可编辑器
- 详解Android中Handler的实现原理
- C++使用CriticalSection实现线程同步实例
- 基于C++实现的线程休眠代码
- Cocos2d-x UI开发之文本类使用实例
- VB读取线程、句柄及写入内存的API代码实例
- C#网络编程基础之进程和线程详解
- C#通过Semaphore类控制线程队列的方法
- C#多线程处理多个队列数据的方法
- 谈谈对jquery ui tabs 的理解