继续上一章android异步加载之Handler、AsyncTask(一)
二、AsyncTask基础
*1. 构建AsyncTask子类的参数
AsyncTask*<*Params,Progress,Result>是一个抽象类,通常被继承实现。继承AsyncTask需要制定如下三个泛型参数:
(1) Params:启动任务时输入参数的类型,该参数是一个varags,比如String…,相当于String[]
(2) Progress:后台任务执行中返回值的类型,该参数是一个varags,比如String…,相当于String[]
(3) Result:后台任务执行完成后返回的结果类型
*2. 构建AsyncTask子类的回调方法
(1) doInBackground:必须重写,异步执行后台线程将要完成的任务(耗时操作处理)(Second)
(2) onPreExecute:执行后台耗时操作前需要调用,通常用户完成一些初始化操作(First)
(3) onPostExecute:当doInBackground()完成后,系统会自动调用onPostExecute,并将doInBackground方法返回的值传给该方法(Fourth)
(4) onProgressUpdate:在doInBackground()方法中调用publishProgress()方法更新任务的执行进度后,就会触发该方法(Third)
*3. 使用步骤
(1) 创建一个AsyncTask的子类,对象创建时带3个参数(参数1,参数2,参数3);
(2) 调用对象的execute()时,启动异步加载进程,执行doInBackground()的代码。execute()中所传递的参数类型在参数1中描述;
(3) 若异步加载需要对某些进行初始化处理,可以在onPreExecute()方法中进行,注意的是这些代码都是在UI线程中执行的;
(4) 执行完异步加载后,需要进行某些处理,例如停止某些UI动画、进度条消失等等,可以重新onPostExecute()方法,同样这些代码都是在UI线程中执行的。该方法将doInBackground()方法的返回值作为onPostExecute()参数,参数类型如参数3描述。
(5) 在执行异步加载的过程中,若需要先UI线程报告(返回值)某个处理状态,可以通过publishProgress()方法来触发,这样在UI主线程中将执行重写后的onProgressUpdate()的代码,其中传递的参数类型如参数2描述。
注意;正确使用AsyncTask的准则:
1) Task的实例必须在UI 线程中创建;
2) execute方法必须在UI 线程中调用;
3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params…), onProgressUpdate(Progress…)这几个方法,需要在UI线程中实例化这个task来调用;
4) 该task只能被执行一次,否则多次调用时将会出现异常。
小例子:异步记载网络图片(进度条+ImageView)。
1. 在doInBackground方法中
String url = “网络图片的地址”;
Bitmap bitmap = null;
URLConnection connection;
InputStream is;
connection = new URL(url).openConnection();
BufferedInputStream bis = new BuferedInputStream(is);
bitmap = BitmapFactory.decodeStream(bis);
2. 在onPreExecute方法中显示进度
3. 在onPostExecute方法中返回得到的Bitmap图,再隐藏进度。