Android异步操作 AsyncTask

首先为什么要进行异步操作呢?主要是因为会有线程的阻塞,阻塞会带来不好的用户体验。那什么叫做异步操作呢?就是两块任务同时执行,相互之间并不干扰。


在Android中除了使用Thread+Handler可以实现多线程之外,还可以使用一个专门封装的类AsynTask来实现。
这里干脆再说说为什么要使用异步操作吧。
假如你在手机上运行一个程序,看到一张图片想下载下来,要大概5-10秒的时间,刚下载着,突然又想点击另外一个东西,这时候你点击就没有相响应了,因为线程被占用着,要等到下载结束你的点击才生效。这个叫做线程的阻塞。这种情况当然不是用户想要的,理想的情况应该是边下图片边干其它的,互不干扰。
怎么实现这种情况呢?多线程。
Android提供了一个叫做AsynTask的类,可以新建一个类来继承这个类,就像如下代码:
public class AsynSleepextends AsyncTask{//三个Void都是大写的V
然后复写doInBackground方法,里面想干啥就干啥。
@Override
protected Void doInBackground(Void... params) {
Sleep sleepFiveSeconds = new Sleep();
sleepFiveSeconds.sleepFive();
return null;
}
}
在其它的Activity的线程中,定义一个AsynSleep类的对象,然后不是调用doInBackground方法,而是调用excute()方法,直接这样就行。
其实这样就是相当于java里面的多线程,只不过android对多线程有了自己的一些封装,这样用起来更加方便,主要还是对于ui的操作,解决ui线程阻塞的问题。
AsyncTask里面的3个Void分别是doInBackground,onProgressUpdate,onPostExcute三个函数的参数,其中第三个也是doInBackground的返回值类型,因为该方法返回的值就是onPostExcute的参数值。



【Android异步操作 AsyncTask】就是说,这样一个类中,通常需要复写的有5个方法,当在ui线程中定义该类的对象并执行execute方法以后,第一个执行的是onPreExcute()方法,通常可以在里面设定一个比如文本值,开始怎么怎么样了,然后就会执行doInBackground()方法,这个方法是最主要的执行方法,它的参数是类的第一个参数,里面执行耗时较长的一些操作,比如更新进度,但是它自己是不能执行更新ui的。然后使用publishProgress(inti)方法,只要这个方法一被调用,就会触发onProgressUpdate()方法,而这个方法是在ui线程里面执行的,这样的话在onProgressUpdate()就能根据这个progress更新进度条,在doInBackground执行完毕以后,返回一个值,这个值就会传给onPostExcute()方法,这个方法也运行在ui线程中,可对ui进行操作。






    推荐阅读