实现线程:继承Thread类或者实现Runnable接口
由于Handler运行在主线程中(UI线程中), 它与子线程可以通过Message对象来传递数据, 这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象,(里面包含数据) , 把这些消息放入主线程队列中,配合主线程进行更新UI。
handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),
Android系统的应用程序是消息驱动的,系统会为每一个应用程序配备一个消息队列,当应用程序运行的时候,该应用程序的主线程会不断的查看消息队列看看有没有消息要处理。
===================================================================
回调函数Run()执行完,线程终止,所以如果你要让线程不断的做一些耗时的事情的时候,你应该在回调函数里整一个循环。
===================================================================
创建线程的两种方法:
1.直接继承Thread,重写run()函数
Public class MyThread extends Thread{
@override
public void run(){
//线程的实现体
}
}
New MyThread().start();
2.实现接口Runnable
Public Class MyRunnable implements Runnable{
@override
public void run(){
//线程的实现体
}
}
New Thread(new MyRunnable()).start();
两种方法的比较:其实两种方法从源码上来看本质是一样,都是调用了create(ThreadGroup group, Runnable runnable, String threadName, long stackSize)函数,只是两种方法再调用的时候传递的参数不一样,
直接继承Thread类的方法:create(null, null, threadName, 0);
实现Runnable接口的方法:create(group, runnable, threadName, 0);
主要区别在于第二个参数,如果为空表示线程的执行方法为继承Thread的类的回调函数run(),如果为runnable,表示线程的执行方法为Runnable的run()方法。
===================================================================
Android中更新UI的操作必须放在被更新的UI的Root线程中,即创建它的线程中。
Android提供了两种事件处理机制:基于监听器的事件处理、基于回调函数的事件处理。
Runnable 究竟是什么?
Runnable 其实只是一个普通的接口,它带有一个抽像函数run(),仅此而已。Runnable不是线程,只是我们可以使用Runnable来作为参数创建线程,我们知道创建线程的两种方法:一是MyThreadObject.start() 另外一种是Thread(MyRunnable).Start()。
因此来看下面的代码:
刚开始是的误解:
1.handler 实现UI更新的原理
2.创建labelTimer控件的线程是主线程,这里(划红线的部分)不是子线程来更新主线程创建的控件吗?怎么不会出错?
解答疑问一:
Handler一直在main thread中执行,有一个不断循环的Looper,不断检索一个容器MessageQueue,这个容器,一旦有Message进来就去执行这个Message,如果这个Message有callback(一个Runnable,如果是handler.post(runnable)的话, 会生成一个Message对象,这个对象的callback参数被赋值成这个runnable对象),那么也去执行这个callback(也就是runnable对象)的run方法(这个就很类似我上面例子中的Test类中的Say方法了,仅仅只是调用这个run方法而已,不是去开线程).
解答疑问二:
Runnable只是一个普通的接口,创建Runnable匿名内部类时这时候当前的线程还是主线程。
原文地址:http://4882994.blog.51cto.com/4872994/1410136