Handler, thread, handlerthread

来源:互联网 发布:php域名白名单 编辑:程序博客网 时间:2024/04/28 22:06

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线程。



0 0