Handler
默认关联主线程,通过Runnable参数 ,直接调用Runnable中的run()方法。handler关联当前thread,并和该线程的looper对应。
要在其他线程执行,可以使用HandlerThread。HandlerThread继承于Thread。与普通Thread的差别就在于,单独建立了一个线程,并且创立了消息队列和自己的looper,在自己的线程分发和处理消息。//可见会增加内存开销和处理开销
当我们需要一个工作者线程,而不是把它当作一次性消耗品,用过即废弃的话,就可以使用它。
当要停止HandlerThread时:
if(HandlerThread!=null) {
HandlerThread.quit();
}
Handler与Activity在同一个线程中,HandlerThread与Activity不在同一个线程,而是别外新的线程中(Handler中不能做耗时的操作)。
//当前是UIthread
mHandler=new Handler();
mHandler.post(new Runnable(){
void run(){ //执行代码...
}
});
//并没有创建线程,依然在UI线程中执行。
handler = new Handler(handlerThread.getLooper(), new Callback() {}
//handler 取到了handlerThread的handler
handler.post(new Runnable() { }
// thread ID 将是handlerThread,不是UIthread了
每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),
Handler在android里负责发送和处理消息, 它有两个作用:
(1):安排消息或Runnable在某个主线程中某个地方执行;
(2):安排一个动作在不同的线程中执行
Handler的一些方法:
post(Runnable)
sendMessage(Message)
以上post类方法允许你排列一个Runnable对象到主线程队列中, sendMessage类方法,允许你安排一个带数据的Message对象到队列中,等待更新。
Thread:
一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了
调用start()方法,通过JVM找到run()方法。然后启动多线程
Runnable:
但是在使用Runnable定义的子类中没有start()方法,也就是说可以通过Thread类来启动Runnable实现的多线程。
在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:
1.避免点继承的局限,一个类可以继承多个接口。
2.适合于资源的共享
runOnUiThread:
把更新ui的代码创建在Runnable中,然后在需要更新ui时,把这个Runnable对象通过runOnUiThread(Runnable)传给UI。
Runnable对像就能在ui程序中被调用。如果当前线程是UI线程,那么行动是立即执行。如果当前线程不是UI线程,操作是发布到事件队列的UI线程。