AsyncTask官方学习
异步任务学习
这两天使用到特别多的AsyncTask
类,一块来学习一下吧
AsyncTask
允许更方便和简单使用UI线程,这个类允许你在UI线程中进行后台操作和展示结果,而无需操作Thread
或者handlers
AsyncTask
是围绕Thread
和Handler
设计的辅助类,并不构成通用线程框架。AsyncTask
最适合的场景是短时间操作(最好几秒钟),如果你需要保持长时间的运行,建议你使用java.util.concurrent
包提供的API,比如Executor
,ThreadPoolExecutor
和FutureTask
一个异步任务是由三个泛型参数(Params,Progress,result
)和四个步骤(onPreExecute,doInBackgroud,onProgressUpdate,onPostExecute
)组成
最简单的使用时必须重写(doInBackgroud(Params...)
)和最常重写(onPostExecute
)方法,比如如下例子
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]);
publicProgress((i/(float)count)*100));
//如果cancel调用的话提前退出
if(isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress){
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result){
showDialog("Downloaded"+result+" bytes");
}
}
调用也非常简单
new DownloadFilesTask().execute(url1,url2,url3);
AsyncTask的三个泛型参数
-
Params
代表衣服任务的执行参数,需要传到doInBackground里面的参数
-
Progress
后台任务执行的进度单位,可以放在进度条中
-
Result
任务执行完成返回的结果。在onPostExecute的参数就是
三个参数不是必须要有的,也可以
private class MyTask extends AsyncTask<Void,Void,Void>{...}
AsyncTask的四个步骤
-
onPreExecute()
在任务执行前被UI线程调用。通常被用来进行任务的一些设置,比如在用户界面显示一个进度条
-
doInBackground(Params...)
在onPreExecute()结束后被后台线程调用,这个步骤被用来放置实际的任务,前面提到的
Params
参数被传递到这里。前面提到的result
参数必须在此步骤中返回,并且传递到最后一步。这里也可以使用publicProgress(Progress...)
通知执行的进度。 -
onProgressUpdate(Progress...)
方法在执行
publishProgress(Progress...)
之后被UI线程调用。这一步可以在用户界面显示任务执行的进度。例如这里通常显示一个进度条或者打印日志字段 -
onPostExecute(Result)
在后台任务完成之后被UI线程调用,后台的结果
result
参数传递到这个方法中
取消任务
可以通过调用cancel(boolean)
方法取消任务,调用之后isCancelled()
会返回True
。在调用此方法之后,onPostExecute(object)
将不再执行,取而代之的是onCancelled(object)
。为了确保任务趋势被取消了,你应该在doInBackground(object[])
始终检查isCancelled()
的值。
一些规则
有一些规则是需要被遵守
AsynacTask
类必须在UI线程中加载- 任务(task)实例必须在UI线程中被创建
- execute()方法必须被UI线程调用
- 不要手动调用
onPreExecute()
、onPostExecute(result)
、doInBackground(Params...)
,onProgressUpdate(Progress...)
- 任务只能被执行一次
具体的参数意义请参见官方文档
posted on 2016-12-17 21:00 kuiblog.com 阅读(148) 评论(0) 编辑 收藏 举报