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