HandlerThread本质上就是一个普通Thread,只是这个线程内部有一个looper,而这个looper有一个消息队列MessageQue,它经过不断的用looper去检查MessageQue而后取出消息而后处理。html
建立一个HandlerThread网络
mThread = new HandlerThread("handler_thread");app
启动一个HandlerThreadide
mThread.start();oop
方式一ui
public class MainActivity extends AppCompatActivity { private HandlerThread myHandlerThread ; private Handler handler ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //建立一个线程,线程名字:handler-thread myHandlerThread = new HandlerThread( "handler-thread") ; //开启一个线程 myHandlerThread.start(); //在这个线程中建立一个handler对象 handler = new Handler( myHandlerThread.getLooper() ){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); //这个方法是运行在 handler-thread 线程中的 ,能够执行耗时操做 Log.d( "handler " , "消息: " + msg.what + " 线程: " + Thread.currentThread().getName() ) ; } }; //在主线程给handler发送消息 handler.sendEmptyMessage( 1 ) ; new Thread(new Runnable() { @Override public void run() { //在子线程给handler发送数据 handler.sendEmptyMessage( 2 ) ; } }).start() ; } @Override protected void onDestroy() { super.onDestroy(); //释放资源 myHandlerThread.quit() ; } }
运行效果:.net
/com.app D/handler: 消息: 1 线程: handler-thread /com.app D/handler: 消息: 2 线程: handler-thread
方式二线程
首先继承了HandlerThread,并实现了 Handler.Callback的接口code
private class MyHandlerThread extends HandlerThread implements Handler.Callback { public MyHandlerThread(String name) { super(name); } @Override public boolean handleMessage(Message msg) { System.out.println("handleMessage CurrentThread=" + Thread.currentThread().getName()); handlerUi.sendEmptyMessage(i); i++; return false; } }
初始化该handlerThread并启动htm
handlerThread = new MyHandlerThread("myHandler"); handlerThread.start();
Ui线程获取能给HandlerThread发消息的Handler
handler = new Handler(handlerThread.getLooper(), handlerThread);
HandlerThread 的使用场景
HandlerThread 所作的就是在新开的子线程中建立了 Looper,那它的使用场景就是 Thread + Looper 使用场景的结合,即:在子线程中执行耗时的、可能有多个任务的操做。
好比:多个下载任务 具体实例可参考连接:http://blog.csdn.net/u011240877/article/details/72905631
HandlerThread将loop转到子线程中处理,说白了就是将分担MainLooper的工做量,下降了主线程的压力,使主界面更流畅。
开启一个线程起到多个线程的做用。处理任务是串行执行,按消息发送顺序进行处理。HandlerThread本质是一个线程,在线程内部,代码是串行处理的。
可是因为每个任务都将以队列的方式逐个被执行到,一旦队列中有某个任务执行时间过长,那么就会致使后续的任务都会被延迟处理。
HandlerThread拥有本身的消息队列,它不会干扰或阻塞UI线程。
对于网络IO操做,HandlerThread并不适合,由于它只有一个线程,还得排队一个一个等着。
参考连接: