Android重新学习记录和心得(一)--Handler、Thread、AsyncTask等

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值