在Android中除了使用Thread+Handler可以实现多线程之外,还可以使用一个专门封装的类AsynTask来实现。
public class AsynSleepextends AsyncTask<Void, Void,Void>{ //三个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<Void, Void, Void>里面的3个Void分别是doInBackground,onProgressUpdate,onPostExcute三个函数的参数,其中第三个也是doInBackground的返回值类型,因为该方法返回的值就是onPostExcute的参数值。
就是说,这样一个类中,通常需要复写的有5个方法,当在ui线程中定义该类的对象并执行execute方法以后,第一个执行的是onPreExcute()方法,通常可以在里面设定一个比如文本值,开始怎么怎么样了,然后就会执行doInBackground()方法,这个方法是最主要的执行方法,它的参数是类的第一个参数,里面执行耗时较长的一些操作,比如更新进度,但是它自己是不能执行更新ui的。然后使用publishProgress(inti)方法,只要这个方法一被调用,就会触发onProgressUpdate()方法,而这个方法是在ui线程里面执行的,这样的话在onProgressUpdate()就能根据这个progress更新进度条,在doInBackground执行完毕以后,返回一个值,这个值就会传给onPostExcute()方法,这个方法也运行在ui线程中,可对ui进行操作。