亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android中AsyncTask詳細介紹

2020-04-11 11:41:32
字體:
來源:轉載
供稿:網友

AsyncTask是一個很常用的API,尤其異步處理數據并將數據應用到視圖的操作場合。其實AsyncTask并不是那么好,甚至有些糟糕。本文我會講AsyncTask會引起哪些問題,如何修復這些問題,并且關于AsyncTask的一些替代方案。

AsyncTask

從Android API 3(1.5 Cupcake)開始,AsyncTask被引入用來幫助開發者更簡單地管理線程。實際上在Android 1.0和1.1也是有類似的實現,那就是UserTask。UserTask和AsyncTask有著相同的API及實現,但是由于由于1.0和1.1的設備份額微乎其微,這里的概念就不會涉及到UserTask。

生命周期

關于AsyncTask存在一個這樣廣泛的誤解,很多人認為一個在Activity中的AsyncTask會隨著Activity的銷毀而銷毀。然后事實并非如此。AsyncTask會一直執行doInBackground()方法直到方法執行結束。一旦上述方法結束,會依據情況進行不同的操作。

1.如果cancel(boolean)調用了,則執行onCancelled(Result)方法
2.如果cancel(boolean)沒有調用,則執行onPostExecute(Result)方法

AsyncTask的cancel方法需要一個布爾值的參數,參數名為mayInterruptIfRunning,意思是如果正在執行是否可以打斷,如果這個值設置為true,表示這個任務可以被打斷,否則,正在執行的程序會繼續執行直到完成。如果在doInBackground()方法中有一個循環操作,我們應該在循環中使用isCancelled()來判斷,如果返回為true,我們應該避免執行后續無用的循環操作。

總之,我們使用AsyncTask需要確保AsyncTask正確地取消。

不好好工作的cancel()

簡而言之的答案,有時候起作用。

如果你調用了AsyncTask的cancel(false),doInBackground()仍然會執行到方法結束,只是不會去調用onPostExecute()方法。但是實際上這是讓應用程序執行了沒有意義的操作。那么是不是我們調用cancel(true)前面的問題就能解決呢?并非如此。如果mayInterruptIfRunning設置為true,會使任務盡早結束,但是如果的doInBackground()有不可打斷的方法會失效,比如這個BitmapFactory.decodeStream() IO操作。但是你可以提前關閉IO流并捕獲這樣操作拋出的異常。但是這樣會使得cancel()方法沒有任何意義。

內存泄露

還有一種常見的情況就是,在Activity中使用非靜態匿名內部AsyncTask類,由于Java內部類的特點,AsyncTask內部類會持有外部類的隱式引用。詳細請參考細話Java:”失效”的private修飾符,由于AsyncTask的生命周期可能比Activity的長,當Activity進行銷毀AsyncTask還在執行時,由于AsyncTask持有Activity的引用,導致Activity對象無法回收,進而產生內存泄露。

結果丟失

另一個問題就是在屏幕旋轉等造成Activity重新創建時AsyncTask數據丟失的問題。當Activity銷毀并創新創建后,還在運行的AsyncTask會持有一個Activity的非法引用即之前的Activity實例。導致onPostExecute()沒有任何作用。

串行還是并行

關于AsyncTask時串行還是并行有很多疑問,這很正常,因為它經過多次的修改。如果你并不明白什么時串行還是并行,可以通過接下來的例子了解,假設我們在一個方法體里面有如下兩行代碼

復制代碼 代碼如下:

new AsyncTask1().execute();
new AsyncTask2().execute();

上面的兩個任務時同時執行呢,還是AsyncTask1執行結束之后,AsyncTask2才能執行呢?實際上是結果依據API不同而不同。

在1.6(Donut)之前:

在第一版的AsyncTask,任務是串行調度。一個任務執行完成另一個才能執行。由于串行執行任務,使用多個AsyncTask可能會帶來有些問題。所以這并不是一個很好的處理異步(尤其是需要將結果作用于UI試圖)操作的方法。

從1.6到2.3(Gingerbread)

后來Android團隊決定讓AsyncTask并行來解決1.6之前引起的問題,這個問題是解決了,新的問題又出現了。很多開發者實際上依賴于順序執行的行為。于是很多并發的問題蜂擁而至。

3.0(Honeycomb)到現在

好吧,開發者可能并不喜歡讓AsyncTask并行,于是Android團隊又把AsyncTask改成了串行。當然這一次的修改并沒有完全禁止AsyncTask并行。你可以通過設置executeOnExecutor(Executor)來實現多個AsyncTask并行。關于API文檔的描述如下

復制代碼 代碼如下:

If we want to make sure we have control over the execution, whether it will run serially or parallel, we can check at runtime with this code to make sure it runs parallel:

復制代碼 代碼如下:

public static void execute(AsyncTask as) {
  if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.HONEYCOMB_MR1) {
      as.execute();
  } else {
      as.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
  }
}
//(This code does not work for API lvl 1 to 3)

真的需要AsyncTask么

并非如此,使用AsyncTask雖然可以以簡短的代碼實現異步操作,但是正如本文提到的,你需要讓AsyncTask正常工作的話,需要注意很多條條框框。推薦的一種進行異步操作的技術就是使用Loaders。這個方法從Android 3.0 (Honeycomb)開始引入,在android支持包中也有包含。可以通過查看官方的文檔來詳細了解Loaders。

本次譯文對原文有少部分刪減修改處理。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91午夜理伦私人影院| 亚洲老司机av| 韩日精品中文字幕| 欧美激情按摩在线| 最新日韩中文字幕| 亚洲自拍偷拍一区| 精品一区精品二区| 中文字幕综合一区| 国产精品稀缺呦系列在线| 精品自在线视频| 尤物九九久久国产精品的分类| 日韩欧美精品网站| 国产激情综合五月久久| 精品少妇v888av| 国内精品一区二区三区| 日韩精品在线观看网站| 亚洲成人精品久久久| 亚洲国产精品久久久久秋霞蜜臀| 97久久久免费福利网址| 欧美小视频在线观看| 欧美日韩精品在线观看| 亚洲深夜福利在线| 91日本视频在线| 国产情人节一区| 国产主播喷水一区二区| 黄色成人在线播放| 成人性生交大片免费看小说| 亚洲天堂精品在线| 国产视频福利一区| 国产性猛交xxxx免费看久久| 欧美高清视频免费观看| 欧美色视频日本高清在线观看| 操日韩av在线电影| 国产一区视频在线| 日韩精品www| 欧美激情视频给我| 裸体女人亚洲精品一区| 欧美午夜丰满在线18影院| 国产精品久久国产精品99gif| 另类图片亚洲另类| 国产91露脸中文字幕在线| 欧美在线一区二区视频| 欧美一区二区色| 亚洲自拍偷拍区| 欧美日本中文字幕| 欧美激情亚洲激情| 中文字幕av一区| 久久久极品av| 成人黄色av网| 欧美亚洲国产另类| 亚洲综合第一页| 成人国产精品一区二区| 久久综合国产精品台湾中文娱乐网| 亚洲综合色激情五月| 久久久99免费视频| 欧美日韩中文在线观看| 久久久久一本一区二区青青蜜月| 亚洲91精品在线| 国产欧美久久一区二区| 欧美高清视频在线播放| 久色乳综合思思在线视频| 亚洲欧美制服综合另类| 成人两性免费视频| 久久精品电影网站| 久久久精品久久久久| 日韩免费在线电影| 2020欧美日韩在线视频| 一区二区三区美女xx视频| 亚洲午夜小视频| 亚洲aaa激情| 亚洲欧美日韩高清| 久久久精品免费视频| 国产午夜精品视频免费不卡69堂| 国产亚洲在线播放| 91在线网站视频| 国产一区二区三区久久精品| 国产亚洲精品91在线| 超在线视频97| 自拍偷拍亚洲在线| 日韩理论片久久| 久久久久久久电影一区| 欧美激情aaaa| 奇门遁甲1982国语版免费观看高清| 日韩亚洲国产中文字幕| 国产97人人超碰caoprom| 日本老师69xxx| 国产精品成人播放| 欧美极品美女视频网站在线观看免费| 精品久久久久久久久久ntr影视| 尤物精品国产第一福利三区| 欧美韩国理论所午夜片917电影| 在线看欧美日韩| 欧美孕妇孕交黑巨大网站| 95av在线视频| 日韩在线观看电影| 国产精品成人品| 欧美激情视频一区二区三区不卡| 高清视频欧美一级| 日本三级韩国三级久久| 麻豆国产va免费精品高清在线| 国产精品日日摸夜夜添夜夜av| 久久激情五月丁香伊人| 亚洲最大的网站| 亚洲国产精彩中文乱码av在线播放| 精品免费在线观看| 日韩欧美中文第一页| 亚洲a区在线视频| 亚洲va久久久噜噜噜| 北条麻妃在线一区二区| 欧美日韩国产综合新一区| 日韩亚洲综合在线| 91九色单男在线观看| 亚洲欧美日韩在线一区| 亚洲一区二区三区在线免费观看| 亚洲少妇激情视频| 最新日韩中文字幕| 亚洲人成毛片在线播放| 91精品久久久久久久久久久| 92版电视剧仙鹤神针在线观看| 最近2019年好看中文字幕视频| 日韩欧美在线视频观看| 久久久www成人免费精品| 欧美成年人网站| 欧美国产日韩一区| 国产日韩av高清| 久久国产精品影片| 国外日韩电影在线观看| www日韩中文字幕在线看| 亚洲精品福利资源站| 亚洲国产精品久久91精品| 亚洲有声小说3d| 欧美电影免费观看大全| 韩国精品美女www爽爽爽视频| 欧美日韩国产影院| 国内精品久久影院| 精品国产一区av| 麻豆成人在线看| 日产日韩在线亚洲欧美| 中文字幕av日韩| 日韩欧美亚洲成人| 亚洲天堂日韩电影| 一本大道香蕉久在线播放29| 成人激情在线观看| 国产美女久久久| 亚洲男人av在线| 亚洲久久久久久久久久| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产成人免费av电影| 97涩涩爰在线观看亚洲| 欧美成人午夜免费视在线看片| 国产精品扒开腿做爽爽爽男男| 日韩在线免费av| 日韩av免费在线| 热久久免费国产视频| 日本精品va在线观看| 国产mv免费观看入口亚洲| 精品久久久久久中文字幕大豆网| 国产精品www| 久久久www成人免费精品| 国产精品美女www爽爽爽视频| 91亚洲精品久久久久久久久久久久| 欧美高跟鞋交xxxxxhd| 日本中文字幕不卡免费| 国产视频亚洲视频|