日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AsyncTask使用详解

發(fā)布時間:2023/12/10 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AsyncTask使用详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。