本人菜鸟一枚,刚看完了安卓异步加载的一个视频,这个视频之前在幕客网上也看过,不过,菜鸟就是菜鸟,当初没怎么在意,现在看了一遍,才有了些想法,所以,写了这篇笔记,已整理自己的学习体会.
1.首先,什么是Asynctask,?
这点就得从安卓的机制说起,安卓的UI线程是一个主线程,假如我们在UI线程里面做些耗时的操作,例如,从网上获取资源,,那么,恭喜你,这个程序有可能会报错,大概内容可能会说APP无反应, .
接下来呢,就给了我们一个提示,对于耗时的操作,我们必须把这些操作放在另外一个线程中执行,也就是所谓的多线程.
关于多线程,可有有人会问?那么我使用java的线程类去开发,行不行呢? 不使用这个所谓额Asynctask. 这个答案当然是可以的.
毕竟安卓也是基于java的嘛.不过呢,安卓的Asynctask是一个已经封装过了的工具,以供我们使用,相对于java的线程来说,使用较为简单些.不过据说Asynctask和java的线程也是有些区别的,具体内容,本笔记不会做论述,有兴趣的道友可以查看其他资料,当然也希望告知菜鸟这个区别,毕竟菜鸟一枚,不懂啊.
2.Asynctask的具体使用:
首先我们要新建一个类,继承这个Asynctask类 ,这时候需要传入三个参数,第一个参数是你需要传入的数据类型,第二个参数是进度过程的参数类型,简单点可以是Integer类型,第三个参数是异步操作后返回的参数类型.
接着呢,需要重载几个方法, 分别是 doinbackground() , onpreexcute(), onpostexcute(), 三个方法,另外还有一个 跟进度有关的方法,好像叫做什么progress的,算了 不管.
接下来,说说这几个方法的回调顺序.
首先会执行的呢是onpreexcute() 然后是doinbackground(),,,,然后是onpostexcute().
关于初始化一些操作可以在onpreexcute()里边执行,,,然后doinbackground() 顾名思义 是后台执行的,负责耗时的操作, 操作后的结果可以在onpostexcute()函数里边跟UI线程通信.
说起跟UI通信,请注意,只可以在onpreexcute() 和onpostexcute() 这两个方法里边执行,不可以在doinbackground()里边执行.
调用Asynctask 只需要在对应的activity中new一个对象出来 并且调用他的excute()方法就可以了.
另外需要注意的地方是,调用Asynctask,是开启一个线程,那么假如我从对应的activity退出后,再重新创建这个activity,就会又开启了一个线程,但是我们的Asynctask是直接从线程池里边拿线程出来的,所以当重复几次这样的操作后,就会出现一种情况,后开启的线程 必须等待前面线程执行完后才能执行,准确的说是,才有线程可以拿.
因此Asynctask最好和对应的activity同步关联起来,例如在对应的activity的onpause()方法中调用Asynctask的cancle方法,但是请注意cancel方法只是对线程做了一个cancle的标志,并没有真正的杀死线程,因此我们还需要在Asynctask的相关回调方法中检查线程的是否有cancle的标志,并执行相对应的操作.
毕竟我们再java中没有办法可以真正的杀死一个线程.