当前位置: 代码迷 >> 综合 >> AsyncTask 的使用介绍及注意事项
  详细解决方案

AsyncTask 的使用介绍及注意事项

热度:99   发布时间:2023-10-19 15:50:32.0
概述:
AsyncTask 可以很适合,方便的利用UI线程。它允许开发者执行后台操作,发布结果在UI线程并且不需要做线程间的切换操作。
它的主要适合于短时操作的情景,如果需要长时间的线程运行,后台操作的话 Executor, ThreadPoolExecutor and FutureTask这三个类比较合适。
用法:
AsyncTask 必须被subclassed之后才可以使用。子类需要重写至少一个方法(doInBackground(Params...)),举个栗子:

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {    
int count = urls.length;       
long totalSize = 0;     
for (int i = 0; i < count; i++) {
totalSize
+= Downloader.downloadFile(urls[i]);
publishProgress
((int) ((i / (float) count) * 100));         
// Escape early if cancel() is called            
if (isCancelled()) break;       
}
return totalSize;    
}
protected void onProgressUpdate(Integer... progress) {

setProgressPercent
(progress[0]);   
}
protected void onPostExecute(Long result) {
showDialog
("Downloaded " + result + " bytes");  
}
}

类创建好之后,调用下面的语句来执行task。
new DownloadFilesTask ().execute (url1 , url2 , url3 );

下面说一下
AsyncTask<Params, Progress, Result>
类里的参数所代表的意义。
Params,是在任务执行的时候所需要的参数类型,比如网络请求一般都需要一个地址链接,需要Url,Params可以设置为String,或者URL都行。(在介绍Asynctask的方法里有涉及到,到时细说)
Progress,表示任务执行的进度,可以是Int,Long。。等。这个值通常会用于设置显示进度的值。
Result,表示任务执行完毕,返回的结果类型。

AsyncTask常用方法:
1.onPreExecute();这个方法在任务task执行之前被调用,通常在该方法内设置task,比如:展示一个progress bar。在UI线程执行。
2.doInBackgroud(Params…);该方法在onPreExecute()方法执行完之后立即执行,该方法主要用来计算,处理task,所以该方法会花费一些时间。上面所说的第一个参数Params就在这个方法中有用到,该方法中可以调用publishProgress(Progress...)方法来展示任务的处理进度,doInBackground()方法执行在后台线程,对此你可能会疑惑,既然是执行在后台线程的,为什么任务进度可以在UI线程显示?别急。。。
3.onProgressUpdate(Progress…);该方法在publishProgress方法调用之后执行,并且运行在UI线程。由此就明白了为什么可以吧任务进度显示出来,就是因为调用了publishProgress和onProgressUpdate这个两个方法,前者用于任务进度的赋值,后者用与UI主线程显示进度。
4.onPostExecute(Result);该方法在运行在UI线程,并且在耗时任务处理完成之后执行。他的参数Result就是处理任务的结果的类型。

关于取消一个任务
一个task可以通过调用cancel(boolean)方法在任何时间取消任务。调用该方法之后,会调用isCancelled()方法返回true,调用该方法之后,会调用onCancelled(object)方法代替onPostExecute(object)在doInBackgroup方法后执行。为了尽快确定该task被cancel与否,需要在doInbackgroup方法里周期的检测isCancelled方法的返回值。

注意:
1.AsyncTask class 必须被加载在UI线程,这个在4.1之后系统自动加载了。
2.Task的实例必须创建在UI线程。
3.execute(Params...)等执行任务的方法必须在UI线程调用。
4.不能手动的调用 onPreExecute(), onPostExecute(Result), doInBackground(Params...),onProgressUpdate(Progress...) 方法。
5.任务只可以被执行一次,超过的话会报错。

AsyncTask默认情况下的执行任务方式是SERIAL_EXECUTOR在backgroud线程中顺序的处理任务。如果想平行的处理任务,需要调用 executeOnExecutor(java.util.concurrent.Executor, Object[]) withTHREAD_POOL_EXECUTOR.


  相关解决方案