1.关于Handler,MessageQueue,Looper,Message
https://blog.csdn.net/sinat_20059415/article/details/79178564
主要讲了Handler的message发送,消息的同步异步。以前只知道Handler可以发送消息,然后一般通过handlerMessage方法来接收各种消息,发现其实Handler还可设置callback,callback会先执行,主要用来做消息的分类,或者多个地方调用Handler。Message也可以带Callback,只不过该方法是隐藏的。
默认的handler执行时是按照MessageQueue的顺序同步执行,一个Looper只允许有一个MessageQueue,但是可以有多个Handler,其实也可以让消息异步立刻执行,需要设置MessageQueue的postSyncBarrier,设置之后会默认生成一个target为null的消息,这时所有同步的消息将都得不到执行,只会执行异步消息,只有消息执行完之后,使用removeSymcBarrier,才会继续执行后续的同步消息。要执行异步消息,还需将Message设置为Async才行。
async机制可以用来做一些消息执行的时候,保证某个消息执行之后,其他消息才会执行的动作
syncBarrier的用处可以参考:https://blog.csdn.net/cdecde111/article/details/54670136
更详细的syncBarrier的讲解参考:https://blog.csdn.net/asdgbc/article/details/79148180
2.关于HandlerThread和Intentservice
https://blog.csdn.net/sinat_20059415/article/details/79244762
HandlerThread其实是谷歌准备的自带looper的thread,并且提供了锁保护的机制,可以用使用这个来创建自己单独运行的在某个线程的handler。
IntentService是为了解决服务处理时间不能过长,里面会自己启动一个HanderThread,将待处理的任务放到单独的线程中去执行,执行完毕后会关闭该service。
这里学到了一点是stopService实际是带有一个id的,如果有多个startService,会根据这个startid是否匹配来决定是否关闭service,这样就会看到即使调用了stopService也不一定会关闭service。
目前还有问题是:startIntentservice始终都起不来service(后来发现犯了一个低级错误:
<service android:name=".MyService"/>,没有再AndroidManifest中声明这个service。
3.有关AsyncTask
https://blog.csdn.net/sinat_20059415/article/details/79304769
Async比较简单,主要注意的是Async创建的时候带三个参数AsyncTask<Params, Progress, Result>,其中:
Params是输入参数,用于doInBackground
Progress是中间过程的参数,用于onProgressUpdate
Result是执行结束的参数,用于onPostExecute
其实从AsyncTask的源码中可以看到,AsyncTask其实是支持将progress和Result放到其他的looperthread中执行的,只不过这种方式是隐藏的,还有需要注意的是默认所有的AsyncTask是共用一份线程池,并且顺序执行,所以一个进程的多个异步任务会串行执行,如果需要并行执行,需要自己给定线程池。其实Async内部已经给出了答案,主要是调用AsyncTask.executeOnExecutor方法,传入参数THREAD_POOL_EXECUTOR即可实现并行执行。
(其实,AsyncTask里面是有两个线程池,默认使用的是串行的线程池,有需要可以主动执行使用并行的线程池,可以多个CPU,启动多个线程去做异步执行任务)
4.有关FutureTask相关
https://blog.csdn.net/sinat_20059415/article/details/79489341
总的来说,FutureTask是集成了Future和Runnable,一般配合线程使用,好处在于Future中带了get()方法,该方法可以等待线程执行结束之后,返回执行的结果。配合Callable使用。
另外,学习到的一点是interrupt其实并不一定会阻止正在执行的线程,只是会中断sleep,线程仍然会继续执行,所以想要结束一个while循环的线程,还是需要配合判断isInterrupt来使用,否则,线程是停止不了的。
另外学习到一个LockSupport,该方法其实就是处理线程的阻塞和唤醒的,park阻塞,unpack唤醒。
Future里面其实是维护者一个状态机,总的来说存在如下状态:
NEW-->COMPLETING->NORMAL
NEW->COMPLETING->EXCEPTION
NEW->CANCELED
NEW->INTERRUTING->INTERRUPTED
调用cancel的时候如果是false,则还未执行完,则退出执行;已经正在执行,等待执行结束;如果是true,则还未执行完,退出执行,正在执行,调用interrupt,取消sleep