AsyncTask使用详解
AsyncTask是一個(gè)抽象類,我們?cè)谑褂脮r(shí)需要定義一個(gè)它的派生類并重寫相關(guān)方法。AsyncTask類的聲明如下:
public abstract class AsyncTask<Params, Progress, Result>- ?
我們可以看到,AsyncTask是一個(gè)泛型類,它的三個(gè)類型參數(shù)的含義如下:
Params:doInBackground方法的參數(shù)類型; Progress:AsyncTask所執(zhí)行的后臺(tái)任務(wù)的進(jìn)度類型; Result:后臺(tái)任務(wù)的返回結(jié)果類型。- ?
我們?cè)賮?lái)看一下AsyncTask類主要為我們提供了哪些方法:
onPreExecute() //此方法會(huì)在后臺(tái)任務(wù)執(zhí)行前被調(diào)用,用于進(jìn)行一些準(zhǔn)備工作?
doInBackground(Params… params) //此方法中定義要執(zhí)行的后臺(tái)任務(wù),在這個(gè)方法中可以調(diào)用publishProgress來(lái)更新任務(wù)進(jìn)度(publishProgress內(nèi)部會(huì)調(diào)用onProgressUpdate方法)?
onProgressUpdate(Progress… values) //由publishProgress內(nèi)部調(diào)用,表示任務(wù)進(jìn)度更新?
onPostExecute(Result result) //后臺(tái)任務(wù)執(zhí)行完畢后,此方法會(huì)被調(diào)用,參數(shù)即為后臺(tái)任務(wù)的返回結(jié)果?
onCancelled() //此方法會(huì)在后臺(tái)任務(wù)被取消時(shí)被調(diào)用
以上方法中,除了doInBackground方法由AsyncTask內(nèi)部線程池執(zhí)行外,其余方法均在主線程中執(zhí)行。
2. AsyncTask的局限性
AsyncTask的優(yōu)點(diǎn)在于執(zhí)行完后臺(tái)任務(wù)后可以很方便的更新UI,然而使用它存在著諸多的限制。先拋開(kāi)內(nèi)存泄漏問(wèn)題,使用AsyncTask主要存在以下局限性:
在Android 4.1版本之前,AsyncTask類必須在主線程中加載,這意味著對(duì)AsyncTask類的第一次訪問(wèn)必須發(fā)生在主線程中;在Android 4.1以及以上版本則不存在這一限制,因?yàn)锳ctivityThread(代表了主線程)的main方法中會(huì)自動(dòng)加載AsyncTask?
AsyncTask對(duì)象必須在主線程中創(chuàng)建?
AsyncTask對(duì)象的execute方法必須在主線程中調(diào)用?
一個(gè)AsyncTask對(duì)象只能調(diào)用一次execute方法
?
使用例子及說(shuō)明:
class MyAsyncTask extends AsyncTask<String,Integer,String> {@Overrideprotected void onPreExecute() {super.onPreExecute();Log.i("lgq","sss=s===onPreExecute==");}@Overrideprotected void onCancelled() {//取消該線程方法 myAsyncTask.cancel(false);super.onCancelled();Log.i("lgq","sss=s===onCancelledddd==");}@Overrideprotected void onProgressUpdate(Integer... values) {//進(jìn)度條回調(diào)方法super.onProgressUpdate(values);//通過(guò)publishProgress方法傳過(guò)來(lái)的值進(jìn)行進(jìn)度條的更新. // progressBar.setProgress(values[0]);Log.i("lgq","sss=s====="+values[0]);}@Overrideprotected void onPostExecute(String aVoid) {//doInBackground結(jié)果回調(diào)方法super.onPostExecute(aVoid);Log.i("lgq","........"+aVoid);}@Overrideprotected String doInBackground(String... params) {//參數(shù)類型是AsyncTask最后一個(gè)參數(shù)類型//使用for循環(huán)來(lái)模擬進(jìn)度條的進(jìn)度.for (int i = 0;i < 100; i ++){//調(diào)用publishProgress方法將自動(dòng)觸發(fā)onProgressUpdate方法來(lái)進(jìn)行進(jìn)度條的更新. // ab++;publishProgress(i);//加載進(jìn)度條方法try {//通過(guò)線程休眠模擬耗時(shí)操作Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}return params[0];}}啟動(dòng)AsyncTask
?
MyAsyncTask myAsyncTask; myAsyncTask = new MyAsyncTask(); myAsyncTask.execute("ssssw232e3");//這個(gè)參數(shù)會(huì)傳遞到doInBackground里面類型后面三個(gè)點(diǎn)(String…),是從Java 5開(kāi)始,Java語(yǔ)言對(duì)方法參數(shù)支持一種新寫法,叫可變長(zhǎng)度參數(shù)列表
在使用的時(shí)候,對(duì)于test(String…strings),你可以直接用test()去調(diào)用,標(biāo)示沒(méi)有參數(shù),也可以用去test(“aaa”),也可以用test(new String[]{“aaa”,”bbb”})。
?doInBackground(String... params),onProgressUpdate(Integer... values)參數(shù)都是數(shù)組類型
?
?
總結(jié)
以上是生活随笔為你收集整理的AsyncTask使用详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android Studio如何导出可供
- 下一篇: 了解iphone的特色传感器