1.
Handler在android里负责发送和处理消息。它的主要用途有:
1)按计划发送消息或执行某个Runnanble(使用POST方法);
2)从其他线程中发送来的消息放入消息队列中,避免线程冲突(常见于更新UI线程)
Handler mHandler = new Handler();
mHandler.post(new Runnable(){
public void run(){
Log.e(TAG, Thread.currentThread().getId() + " " +count);
}
});
mHandler.post(mRunnable)执行了run()方法,并没有执行Thread的start()方法去开启一个新的线程
因此,子线程是运行在UI主线程中的,不适合进行比较耗时的操作,会阻塞主线程UI队列。
2.
HandlerThread继承于Thread,所以它本质就是个Thread。
与普通Thread的差别就在于,它有个Looper成员变量。这个Looper其实就是对消息队列以及队列处理逻辑的封装,简单说就是 消息队列+消息循环。
当我们需要一个工作者线程,而不是把它当作一次性消耗品,用过即废弃的话,就可以使用它。
Handler mHandler = new Handler();
mHandler.post(new Runnable(){
public void run(){
Log.e(TAG, Thread.currentThread().getId() + " " +count);
}
});
mHandler.post(mRunnable)执行了run()方法,并没有执行Thread的start()方法去开启一个新的线程
因此,子线程是运行在UI主线程中的,不适合进行比较耗时的操作,会阻塞主线程UI队列。
2.
HandlerThread继承于Thread,所以它本质就是个Thread。
与普通Thread的差别就在于,它有个Looper成员变量。这个Looper其实就是对消息队列以及队列处理逻辑的封装,简单说就是 消息队列+消息循环。
当我们需要一个工作者线程,而不是把它当作一次性消耗品,用过即废弃的话,就可以使用它。
HandlerThread handlerThread = new HandlerThread("threadone");
handlerThread.start(); //开启一个新的线程
Handler mHandler = new Handler(handlerThread.getLooper());
mHandler.post(new Runnable(){
public void run(){
}
});
通过HandlerThread新建的线程是一个新的线程,不是运行在UI主线程中的,不能操作UI,但是可以通过Message发送消息来进行操作。
可以用来处理一些比较耗时的操作。