安卓Handler机制的简单介绍——随机点名案例
来源:互联网 发布:fifa online3数据库cc 编辑:程序博客网 时间:2024/06/04 01:16
笔者是一位初学Android的学生,前些阵子一直搞不懂关于Handler机制的一些问题,最近在网上找了不少资料,并加上自己的理解,写一个关于Handler机制工作原理的文章。
我们知道,Android的UI线程也叫主线程,工作线程(子线程)主要是负责执行耗时操作的线程,那么,主线程要更新UI界面显示,必须通过子线程发的消息,才能作出对应的操作。那么,主线程是怎么知道什么时候要更新UI显示的呢,这个就是通过Handler机制发送的消息来执行。
首先来简单阐明一下几个关键字的概念:
1、Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。
2、Handler::你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。
3、 Message Queue(消息队列):用来存放线程放入的消息。
4、线程:UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。
子线程发送消息到Message Queue,主线程通过Looper去轮循这个消息队列,Looper轮循到的消息再传给主线程,主线程作出对应的操作,基本就是这样一个过程,对于新手,我觉得不用太纠结Handler到底是怎么内部工作的,毕竟我一开始也纠结了挺久的,到现在也是略知一二。
大家可以通过下面这个“随机点名“的例子来进一步加深对Handler机制的理解:
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity implements View.OnClickListener{
private Button btnStart;
private TextView tvName;
private Handler handler;
private boolean isRunning;
private List<String> names;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnStart = (Button) findViewById(R.id.btn_start);
tvName = (TextView) findViewById(R.id.tv_name);
names = getNames();
btnStart.setOnClickListener(this);
handler = new Handler(new InnerCallback());
}
@Override
public void onClick(View v) {
if(isRunning == true){
isRunning = false;
btnStart.setText("Start");
}else{
isRunning = true;
new InnerThread().start();
btnStart.setText("Stop");
}
}
private class InnerCallback implements Handler.Callback{
@Override
public boolean handleMessage(Message msg) {
int index = msg.arg1;
String name = names.get(index);
tvName.setText(name);
return false;
}
}
private class InnerThread extends Thread{
Random random = new Random();
int nameCount = names.size();
int ranNumber;
long sleep = 500;
@Override
public void run() {
while(isRunning){
ranNumber = random.nextInt(nameCount);
Message.obtain(handler, 0, ranNumber, 0).sendToTarget();
}
try {
Thread.sleep(sleep);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private List<String> getNames(){
List<String> names = new ArrayList<String>();
names.add("周星驰");
names.add("成龙");
names.add("李连杰");
names.add("叶问");
names.add("甄子丹");
names.add("刘德华");
names.add("贾静雯");
names.add("吴孟达");
names.add("萧十一郎");
names.add("小李飞刀");
names.add("神雕侠侣");
return names;
}
}
下图是点击开始随机循环:
下图是正在随机点名循环中,点击按钮停止,再次点击继续,如此。。
这样就实现了一个简单的随机点名的案例。
欢迎大家指正。
- 安卓Handler机制的简单介绍——随机点名案例
- 简单的随机点名系统
- 一个简单的随机点名器。
- Python 小案例 随机点名
- 安卓Handler机制
- 数组的随机点名
- 安卓Handler消息机制的例子
- 安卓触摸事件处理机制的简单介绍
- Java实现一个简单的随机点名器
- JAVA基础 随机点名器案例
- 安卓Handler消息机制
- 安卓之handler机制
- 简单的介绍handler
- 安卓Handler类介绍
- handler——handler机制的原理
- 你被选中了——晚会上的随机点名
- 网络121第3周实验——实现随机点名的签到程序
- 我对安卓handler机制的理解
- 占位1
- eclipse importing maven projects 9% 不动
- sqlite数据库常用语句
- 占位2
- 占位3
- 安卓Handler机制的简单介绍——随机点名案例
- Linux
- Android Activity四种启动模式
- 正则的替换功能
- 习题3-4 UVa455 Periodic Strings
- 若有必要,使用变长数组
- devstack部署openstack的情况下,重启openstack服务
- CAAnimation
- Java并发编程:深入剖析ThreadLocal