实现线程:继承Thread类或者实现Runnable接口ide
因为Handler运行在主线程中(UI线程中), 它与子线程能够经过Message对象来传递数据, 这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象,(里面包含数据) , 把这些消息放入主线程队列中,配合主线程进行更新UI。函数
handler能够分发Message对象和Runnable对象到主线程中, 每一个Handler实例,都会绑定到建立他的线程中(通常是位于主线程),oop
Android系统的应用程序是消息驱动的,系统会为每个应用程序配备一个消息队列,当应用程序运行的时候,该应用程序的主线程会不断的查看消息队列看看有没有消息要处理。post
===================================================================spa
回调函数Run()执行完,线程终止,因此若是你要让线程不断的作一些耗时的事情的时候,你应该在回调函数里整一个循环。线程
===================================================================对象
建立线程的两种方法:blog
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匿名内部类时这时候当前的线程仍是主线程。