1.Thread
start()和run()的区别
Thread的start方法开启了线程,并在线程中执行了run方法,而run则只是在当前线程中执行了其构造函数中传入的Runnable对象的run方法
2.AsyncTask的原理:
2个线程池(任务队列线程池+执行线程池)+ 1个Handler
3.HandlerThread:
HandlerThread本质上是一个线程类,继承自Thread。
HandlerThread本身有自己的Looper对象。讲HandlerThread中的Looper对象获取后传给Handler,就可以在Handler中的HandleMessage中处理异步消息
优点与缺点
优点:不会有阻塞,减少对性能的消耗
缺点:不能同时进行多任务处理,效率不高。HandlerThread是一个串行队列,内部只有一个线程。
HandlerThread的作用
一般是用在子线程跟子线程进行通信
4.IntentService
原理:IntentService是个抽象类,继承自Service,类中有一个mServiceLooper、一个mServiceHandler。在onCreate方法中创建了一个HandlerThread,并且通过HandlerThread获取到了mServiceLooper,最后通过这个mServiceLooper创建了mServiceHandler。mServiceHandler通过消息回调来处理多任务
面试题:
(1)为何能执行耗时任务
IntentService内部是采用Thread+Handler去处理任务的,也即是开启了新的线程,所以它是能执行耗时任务的
(2)执行完任务为何会自动destory?
在ServiceHandler的handleMessage方法里调用了stopSelf()
5.Handler
原理:在主线程中Android默认已经调用了Looper.preperMainLooper方法,调用该方法的目的是在Looper中创建MessageQueue成员变量并把Looper对象绑定到当前线程中(ThreadLocal)。当调用Handler的sendMessage方法的时候,就将Message对象添加到了Looper创建的MessageQueue队列中,同时给Message指定了target对象,其实这个target对象就是Handler对象。主线程默认执行了Looper.looper()方法,该方法从Looper的成员变量MessageQueue队列中调用Message的target对象的dispatchMessage方法(也就是msg.target.dispatchMessage方法)取出Message,然后在dispatchMessage方法中调用Message的target对象的handleMessage()方法(也就是msg.target.handleMessag),这样就完成了整个消息机制
6.EventBus