最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android 中糟糕的AsyncTask

 更新時間:2016年08月31日 17:43:49   作者:技術(shù)小黑屋  
本文主要介紹Android 中的AsyncTask,這里整理了AsyncTsak 異步處理數(shù)據(jù)的知識,并且講到引起的問題和替代方案,有興趣的小伙伴可以參考下

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

AsyncTask

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

生命周期

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

如果cancel(boolean)調(diào)用了,則執(zhí)行onCancelled(Result)方法

如果cancel(boolean)沒有調(diào)用,則執(zhí)行onPostExecute(Result)方法

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

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

不好好工作的cancel()

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

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

內(nèi)存泄露

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

結(jié)果丟失

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

串行還是并行

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

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

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

在1.6(Donut)之前:

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

從1.6到2.3(Gingerbread)

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

3.0(Honeycomb)到現(xiàn)在

好吧,開發(fā)者可能并不喜歡讓AsyncTask并行,于是Android團隊又把AsyncTask改成了串行。當然這一次的修改并沒有完全禁止AsyncTask并行。你可以通過設置executeOnExecutor(Executor)來實現(xiàn)多個AsyncTask并行。關(guān)于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雖然可以以簡短的代碼實現(xiàn)異步操作,但是正如本文提到的,你需要讓AsyncTask正常工作的話,需要注意很多條條框框。推薦的一種進行異步操作的技術(shù)就是使用Loaders。這個方法從Android 3.0 (Honeycomb)開始引入,在android支持包中也有包含??梢酝ㄟ^查看官方的文檔來詳細了解Loaders。

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

以上就是對Android AsyncTsak 的資料整理,后繼續(xù)補充相關(guān)資料,謝謝大家對本站的支持!

相關(guān)文章

  • 史上最全Android build.gradle配置詳解(小結(jié))

    史上最全Android build.gradle配置詳解(小結(jié))

    這篇文章主要介紹了史上最全Android build.gradle配置詳解(小結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04
  • Android仿微信聯(lián)系人字母排序效果

    Android仿微信聯(lián)系人字母排序效果

    大家使用到的聯(lián)系人界面,幾乎都是按照字母排序,如何實現(xiàn)聯(lián)系人按字母排序?下面就為大家詳解介紹了Android仿微信聯(lián)系人按字母排序的實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Flutter質(zhì)感設計之進度條

    Flutter質(zhì)感設計之進度條

    這篇文章主要為大家詳細介紹了Flutter質(zhì)感設計之進度條,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 如何在Android中實現(xiàn)漸顯按鈕的左右滑動效果

    如何在Android中實現(xiàn)漸顯按鈕的左右滑動效果

    本篇文章是對在Android中實現(xiàn)漸顯按鈕的左右滑動效果進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • Android實現(xiàn)電影院選座效果

    Android實現(xiàn)電影院選座效果

    這篇文章主要為大家詳細介紹了Android實現(xiàn)電影院選座效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Android文字匹配度算法及實際應用示例

    Android文字匹配度算法及實際應用示例

    本文介紹了Android應用中常用的文字匹配度算法Levenshtein Distance,并給出了實際應用示例,通過合理選擇和應用文字匹配度算法,可以實現(xiàn)多種功能,提升用戶體驗,增強應用的實用性,需要的朋友可以參考下
    2024-05-05
  • EditText限制輸入數(shù)字,精確到小數(shù)點后1位的設置方法

    EditText限制輸入數(shù)字,精確到小數(shù)點后1位的設置方法

    下面小編就為大家?guī)硪黄狤ditText限制輸入數(shù)字,精確到小數(shù)點后1位的設置方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • init output stream初始化輸出流源碼分析

    init output stream初始化輸出流源碼分析

    這篇文章主要為大家介紹了init output stream初始化輸出流源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • RxRetroHttp為多套API請求適配而生

    RxRetroHttp為多套API請求適配而生

    今天小編就為大家分享一篇關(guān)于RxRetroHttp為多套API請求適配而生,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • Android開發(fā)實現(xiàn)保存圖片到手機相冊功能

    Android開發(fā)實現(xiàn)保存圖片到手機相冊功能

    這篇文章主要介紹了Android開發(fā)實現(xiàn)保存圖片到手機相冊功能,涉及Android圖形及文件相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03

最新評論

保定市| 泸州市| 温州市| 眉山市| 固安县| 阜康市| 中山市| 南华县| 乡城县| 布拖县| 桂东县| 延寿县| 元江| 商水县| 西林县| 吉水县| 宜宾县| 海林市| 塔城市| 肥西县| 沁水县| 大悟县| 沽源县| 项城市| 周至县| 钦州市| 永寿县| 敖汉旗| 天等县| 嘉义市| 桂林市| 布拖县| 镇原县| 朝阳市| 平邑县| 子洲县| 曲麻莱县| 潜江市| 百色市| 黔江区| 织金县|