AsyncTask使用方式和版本演進

介紹

AsyncTask是一個輕量級的異步任務類癣漆,它可以在線程池中執(zhí)行任務,然后把結果和執(zhí)行進度傳遞到主線程并在主線程更新UI剂买。內部實現封裝了Thread和Handler惠爽,可以方便的執(zhí)行后臺任務以及主線程中訪問UI,但是AsyncTask并不適合執(zhí)行特別耗時的操作瞬哼,耗時操作建議使用線程池婚肆。

核心方法

AsyncTask是一個抽象的泛型類提供了三個泛型參數<Params,Progress,Result>,Params表示參數的類型坐慰,Progress表示運行的進度较性,Result表示運行結束后返回的結果類型。

主要提供可以下四個核心方法:

1.onPreExecute()结胀,在主線程中執(zhí)行,在異步任務以前,主要做一些準備工作

2.doInBackground(Params... params)赞咙,在線程池中工作,params是傳遞進來的參數,在這個方法中可以通過publicProgress方法來更新進度糟港,public會調用onProgressUpdate方法來更新進度攀操。這個方法需要返回計算結果返回給onPostExecute方法

3.onProgressUpdate(Progress progress),這個方法運行在UI線程中秸抚,用來更新進度

4.onPostExecute(Result result)速和,運行在主線程中歹垫,doInBackground運行完成后會調用此方法,result既是是doInBackground返回的結果

使用方式和注意

1.一個asynctask對象只能執(zhí)行一次颠放,如果多次調用一個對象會報 Cannot execute task: the task is already running.異常

2.使用execute()運行AsyncTask县钥,3.0(API 11)以后默認是串行執(zhí)行任務。也可以通過executeOnExecutor方法并行執(zhí)行任務慈迈,可以根據不同需求傳遞通過executeOnExecutor(Executor exec,Params... params)構造方法傳遞一個Executor 設置線程池并行的數量,如下圖:設置固定5個線程的線程池省有,只有前5個任務執(zhí)行完畢后痒留,最后兩個線程才會執(zhí)行

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_asynctask);
      newFixedExecutor = Executors.newFixedThreadPool(5);//設置固定5個線程的線程池
      myAsyncTask =new MyAsyncTask();
      myAsyncTask2 =new MyAsyncTask();
      myAsyncTask3 =new MyAsyncTask();
      myAsyncTask4 =new MyAsyncTask();
      myAsyncTask5 =new MyAsyncTask();
      myAsyncTask6 =new MyAsyncTask();
      myAsyncTask7 =new MyAsyncTask();
}
btn.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
           myAsyncTask.executeOnExecutor(newFixedExecutor ,mProgressBar);
           myAsyncTask2.executeOnExecutor(newFixedExecutor ,mProgressBar2);
           myAsyncTask3.executeOnExecutor(newFixedExecutor ,mProgressBar3);
           myAsyncTask4.executeOnExecutor(newFixedExecutor ,mProgressBar4);
           myAsyncTask5.executeOnExecutor(newFixedExecutor ,mProgressBar5);
           myAsyncTask6.executeOnExecutor(newFixedExecutor ,mProgressBar6);
           myAsyncTask7.executeOnExecutor(newFixedExecutor ,mProgressBar7);
      }
});
Screenshot_20180828-112340.jpg

Screenshot_20180828-112349.jpg

3.AsyncTask不適合執(zhí)行特別耗時的操作,耗時操作建議使用線程池來完成

4.AsyncTask一般都說只能在主線程中調用蠢沿,但是在API 26下伸头,看AsyncTask源碼其實也可以在子線程中調用,因為在初始化Handler時已經將主線程的Looper傳遞Handler(如下圖代碼)舷蟀,這樣消息仍然可以傳遞給主線程恤磷。其他以前版本源碼沒有看過,但是能不能在其他線程中運行野宜,就看源碼中是否傳遞的Looper是當前線程的還是getMainLooper()扫步,如果是getMainLooper,那么在其他線程運行應該就沒問題匈子。

private static Handler getMainHandler() {
        synchronized (AsyncTask.class) {
            if (sHandler == null) {
                sHandler = new InternalHandler(Looper.getMainLooper());
            }
            return sHandler;
        }
    }

AsyncTask版本演進

1.在1.6之前河胎,AsyncTask是串行執(zhí)行任務
2.在1.6的時候,AsyncTask開始采用線程池處理并行任務
3.但是從3.0開始為了避免AsyncTask所帶來的并發(fā)錯誤虎敦,AsyncTask又采用一個線程來串行執(zhí)行任務游岳,但是仍然可以通過executeOnExecutor方法來并行執(zhí)行任務

參考

1.《Android開發(fā)藝術開發(fā)探索》任玉剛

  1. AsyncTask 坑(一) 哪些線程可以調用AsyncTask

  2. Android實戰(zhàn)技巧:深入解析AsyncTask

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市其徙,隨后出現的幾起案子胚迫,更是在濱河造成了極大的恐慌,老刑警劉巖唾那,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件访锻,死亡現場離奇詭異,居然都是意外死亡通贞,警方通過查閱死者的電腦和手機朗若,發(fā)現死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昌罩,“玉大人哭懈,你說我怎么就攤上這事【ビ茫” “怎么了遣总?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵睬罗,是天一觀的道長。 經常有香客問我旭斥,道長容达,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任垂券,我火速辦了婚禮花盐,結果婚禮上,老公的妹妹穿的比我還像新娘菇爪。我一直安慰自己算芯,他們只是感情好,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布凳宙。 她就那樣靜靜地躺著熙揍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪氏涩。 梳的紋絲不亂的頭發(fā)上届囚,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音是尖,去河邊找鬼意系。 笑死,一個胖子當著我的面吹牛析砸,可吹牛的內容都是我干的昔字。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼首繁,長吁一口氣:“原來是場噩夢啊……” “哼作郭!你這毒婦竟也來了?” 一聲冷哼從身側響起弦疮,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤夹攒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后胁塞,有當地人在樹林里發(fā)現了一具尸體咏尝,經...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年啸罢,在試婚紗的時候發(fā)現自己被綠了编检。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡扰才,死狀恐怖允懂,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情衩匣,我是刑警寧澤蕾总,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布粥航,位于F島的核電站,受9級特大地震影響生百,放射性物質發(fā)生泄漏递雀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一蚀浆、第九天 我趴在偏房一處隱蔽的房頂上張望缀程。 院中可真熱鬧,春花似錦市俊、人聲如沸杠输。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至僵刮,卻和暖如春据忘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背搞糕。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工勇吊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窍仰。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓汉规,卻偏偏與公主長得像,于是被迫代替她去往敵國和親驹吮。 傳聞我的和親對象是個殘疾皇子针史,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內容