java自带的线程已经慢不错的了,在android里又进了一步。一开始,在java传统的Thread和Runnable里加上了handler就已经蛮不错的了,handler作为信息调配的中转站,让人用的很输入,线程就只管去计算,分配的事就不要你做了。我写的东西有点杂乱无章,呵呵。再后来就到了高级一点的HandlerThread,把资源费配的Handler和线程Thread放在了一起,我比较喜欢的是,重新启动一个线程非常的方便。
这样一下就可以了,线程已经被启动,而且可以调用HandlerThread类自带的。然后调用getLooper调取线程里的消息循环,送入handleMessage来处理。
getLooper是HandlerThread也是帮我们封装好了的。
如果要自己打包消息循环就可以这样做,JDK文档上就是这么写的:
Threads by default do not have a message loop associated with them; to create one, call prepare()
in the thread that is to run the loop, and then loop()
to have it process messages until the loop is stopped
线程默认是不会有一个与之相关的消息队列,你必须调用prepare()方法来创建,然后用静态方法loop()来将消息加入进去,知道循环的结束。
以上"传统"的方式还是比较的负责,当我们拥有了HandlerThread后一切边的比较的简单了:
一般,情况下这里的东西已经很适用,但是google就是技术届的大哥大,非要把技术更上一层楼,所有有出现了:AsyncTask
这个东西非常的好,比HandlerThread封装的还要厉害。先看代码
AsyncTask线程我觉得最大的作用就是在后台新建一个线程来计算,然后把计算得到的结果用onPostExecute来更新UI线程。在android中,子线程是不能直接操作主线程(UI线程),只能通过子线程的某个方法来把计算结果让这个方法来处理。先看看AsyncTask构造方法的源码:
重点看这里:
这里就是handlerMessage处理 消息了,也就是封装了我们的xhandler extends Handler(){}.....。还有一个重要的是doInBackground是在新线程里面的,起码的方法是在主线程里的,也就验证了,doInBackground在新线程里处理或者计算,然后调用对应在主线程里的方法来更新UI
对于移动设备来说,多线程的处理是非常之重要的。我也是才开始看android的,有什么说的不对的,请大家拍砖,大家共同进步