1. 程式人生 > >此部落格不再更新,請訪問: http://blog.csdn.net/qq_29078329

此部落格不再更新,請訪問: http://blog.csdn.net/qq_29078329

使用:

onPreExecute(),在後臺任務開始執行之前呼叫,用於進行一些介面上的初始化操作,比如顯示一個進度條對話方塊(主執行緒中執行);doInBackground(Params...),在這裡處理耗時任務,任務完成後可以通過return語句將任務的執行結果返回,在這個方法中不可以進行UI操作,如果需要更新UI元素,比如說反饋當前任務的執行進度,可以呼叫publishProgress(Progress...)完成(子執行緒中執行);onProgressUpdate(Progress...),在後臺任務中呼叫了publishProgress(Progress...)後,這個方法會被呼叫,方法中攜帶的引數是後臺任務傳遞過來的,利用引數中的數值可以對

UI進行更新(主執行緒中執行)onPostExecute(Result),後臺任務執行完畢,返回的資料作為引數傳遞到這個方法中,可以利用返回的資料來進行一些UI操作,比如提醒任務執行的結果,以及關掉進度條等。(主執行緒中執行)

條件限制:

1AsyncTask必須在主執行緒中載入,也就是第一次訪問AsyncTask必須發生在主執行緒中,4.1以及以上版本中已經被系統自動完成。

2 AsyncTask物件必須在主執行緒中建立,並且execute()方法必須在UI執行緒中呼叫

3一個AsyncTask物件只能執行一次,即只能呼叫一次execute()方法,否則會報執行時異常

4不要在程式中直接呼叫

AsyncTask中的方法(execute()除外)

原始碼分析:

呼叫execute()方法執行任務的時候,系統會把AsyncTask的Params引數封裝成FutureTask物件,FutureTask是一個併發類,充當Runnalbe的作用。接著FutureTask會交給SerialExecutor的execute()方法去處理,SerialExecutor是序列的執行緒池,處理之前onPreExecute()方法會第一個得到執行,然後SerialExecutor的Execute()方法首先會把FutureTask物件插入到任務佇列中,如果這個時候沒有正在活動的AsyncTask任務,SerialExecutor會從佇列中取出任務然後執行,當前任務執行完後,其他的任務才會得到執行,直到所有的任務執行完為止。FutureTask的run()方法中會呼叫callable物件的call方法,doInBackground()方法在call方法中執行(子執行緒中執行),doInBackground()的返回值會傳遞給postResult(),postResult()會通過handler(這個handler是在主執行緒中建立的)傳送一個message,message中附加了doInBackground()的返回值,handler收到訊息後在finish()方法中決定呼叫onCancelled()或者onPostExecute()。

執行緒池分類:

Android 3.0之前,AsyncTask中執行緒的執行是併發的,執行緒池同一時刻能夠執行的執行緒數為5個,任務佇列總大小為128。3.0之後,AsyncTask 增加了SerialExecutor類,呼叫execute()方法(或者executeOnExecutor(AsyncTask.SERIAL_EXECUTOR))執行任務使用的是SerialExecutor,這個類是單一執行緒池,提交的任務會按先後順序執行,每次只啟動一個執行緒執行,完成之後再執行第二個。如果需要多個執行緒併發執行的話,要自定義執行緒池,呼叫executeOnExecutor()在自定義的執行緒池裡執行任務。

      執行緒池的真正實現類是ThreadPoolExecutor,引數1執行緒池的核心執行緒數,執行緒池允許併發的最大執行緒數,引數2執行緒池能容納的最大執行緒數,引數3非核心執行緒(等待的執行緒)閒置時的超時時間,超過這個時間,等待的執行緒會被回收;如果ThreadPoolExecutor設定了allowCoreThreadTimeOut屬性為true的話,引數3同樣作用於核心執行緒,即核心執行緒執行超過這個時間,核心執行緒也會被回收,引數4是引數3的單位,毫秒、秒、分鐘,引數5儲存所有的callable物件。下面程式碼允許在同一時刻有15個任務正在執行,並且最多能夠儲存200個任務。


四類執行緒池:

FixedThreadPool(定長執行緒池),可以指定執行緒最大併發數,超出的執行緒入隊等待,任務佇列大小沒有限制,執行緒空閒不會被回收。ScheduledThreadPool,同FixedThreadPool,但是等待的執行緒超時後會被回收。CachedThreadPool(快取執行緒池),所有的任務都會立刻被執行,如果執行緒池裡有空閒執行緒的話,會利用空閒執行緒執行新任務,否者會建立新的執行緒處理新任務,空閒執行緒超過60秒會被回收。SingleThreadExecutor(單一執行緒池),所有的任務序列執行,SerialExecutor就是單一執行緒池。


保證執行緒併發執行(5個執行緒併發執行,Honeycomb是3.0系統):



AsyncTask缺點:

(1) 記憶體洩露,在Activity中使用非靜態匿名內部AsyncTask類,AsyncTask內部類會持有外部類的隱式引用,AsyncTask的生命週期可能比Activity的長,當Activity銷燬後,如果AsyncTask還在執行,由於AsyncTask持有Activity的引用,導致Activity物件無法回收,進而產生記憶體洩露。

(2) 在螢幕旋轉等造成Activity重新建立時,AsyncTask資料丟失的問題。當Activity銷燬並重新建立後,還在執行的AsyncTask會持有之前的Activity例項,導致onPostExecute()沒有任何作用,UI不會得到更新,在activity銷燬之前必須保證AsyncTask執行完成或者取消執行。

參考:

http://droidyue.com/blog/2014/11/08/bad-smell-of-asynctask-in-android/




相關推薦

部落不再更新訪問 http://blog.csdn.net/qq_29078329

使用: onPreExecute(),在後臺任務開始執行之前呼叫,用於進行一些介面上的初始化操作,比如顯示一個進度條對話方塊(主執行緒中執行);doInBackground(Params...),在這裡處理耗時任務,任務完成後可以通過return語句將任務的執行結果返回,在

the_fire的技術部落部落為存檔新文章在http://www.the5fire.com)

backbone.js入門教程 backbone.js是一個基於jquery和underscore.js庫的一個web端的MVC框架,使用它可以幫你更好的組織web端的js程式碼以及更靈活的操作dom以及繫結事件。關於它的中文資料

引用部落http://blog.csdn.net/u012230055/article/details/64125268

一 、SourceTree簡介 SourceTree 是 Windows 和Mac OS X 下免費的 Git 和 Hg 客戶端,擁有視覺化介面,容易上手操作。同時它也是Mercurial和Subversion版本控制系統工具。支援建立、提交、clone、push、pu

Linux串列埠程式設計教程(三)——串列埠程式設計詳(原始碼)解http://blog.csdn.net/u011192270/article/details/48174353 Linux下的串列埠程式設計(二)----(圖文並茂講解深刻)http://blog.csdn.net/w28252

Linux串列埠程式設計教程(三)——串列埠程式設計詳(原始碼)解:http://blog.csdn.net/u011192270/article/details/48174353 Linux下的串列埠程式設計(二)----(圖文並茂,講解深刻)http://blog.csdn.ne

java發http請求原地址https://blog.csdn.net/ludonglue/article/details/78038643

  1.使用jdk提供的URLConnection  2.使用apache提供的HttpClient(封裝了jdk) 一、使用URLConnect進行http請求 public static void main(String[] args) { //傳送

Mongodb 叢集加keyFile認證Mongodb使用者管理(轉http://blog.csdn.net/wlzjsj/article/details/61421230)

介紹 自從遠古計繩結開始,資料庫的儲存就註定了今天的地位和多樣性,Nosql的出現更是解決了現有的關係型資料庫無法解決的一些難題,對高效能,靈活度,擴充套件性,海量資料的問題。隨之而出現的高速記憶體索引資料庫、列式儲存、影象儲存等等,這篇文章主要講的是mongodb文件型資料庫,mongodb目

fiddler filters 使用(fiddler只顯示指定請求fiddler不顯示指定請求即filter請求過濾)轉自http://blog.csdn.net/notejs/article/

fiddler filters 使用(fiddler只顯示指定請求,fiddler不顯示指定請求,即filter請求過濾)Fiddler 有一個filters可以很好的幫助我們只顯示我們關係的請求或者隱藏掉我們不關心的請求。這在開發中是非常有用的,尤其是你在這邊想看請求,那邊

Notepad++外掛之ftp/sftp遠端編輯功能以及各種外掛(轉http://blog.csdn.net/happy_wu/article/details/73302994)

Notepad++的ftp/sftp遠端編輯功能介紹:Notepad++是一個優秀的開源編輯器,最大特性就是外掛豐富,這裡分享一下我常用的實用外掛,其中一些是Npp預裝的。這些外掛主要是開發相關的,所以如果想需要其它外掛,可以瀏覽一下。這裡我主要寫的是FTP外掛。一般情況下我

CSDN 2018 年 部落之星為我投一票感謝!~

我與CSDN很有緣分,第一篇部落格發表於CSDN,後陸陸續續在其他平臺上發表部落格,但最終還是迴歸到了CSDN。 作為一名程式設計師,需要保持一顆對技術追求的心,在任何時候都不要忘記自己學習技術。我是一個對技術追求比較高的人,在日常工作和學習的時候,對技術有一點想法,或者覺得值得記錄

部落已停用博文會逐漸轉移到新地址http://blog.csdn.net/liupeifeng3514

RabbitMQ的安裝過程非常簡單:由於RabbitMQ是基於Erlang語言開發並執行的,所以安裝RabbitMQ的第一步是安裝Erlang執行環境。您可以在https://www.erlang-solutions.com/resources 下載最新Erla

關於部落不再更新的說明

謝謝各位對我的支援,由於早已不再從事軟體測試行業,所以部落格也就一直沒有更新,看到了很多大家的留言也沒能一一回復,深感抱歉。工作也比較忙,以後也不會更新了,本打算把部落格關掉,想了一下還是留著唄,還請大家見諒。 看到很多技術細節的問題沒有環境也不好回答了,很多求資源的,有

部落搬家了大家繼續關注~

我的部落格即將搬運同步至騰訊雲+社群,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=21lcucs4283o

【zylzb的專欄】該部落使用部落搬家功能從http://haohaoxuexi.iteye.com搬遷過來發現搬遷過來的效果不好決定陸續手動搬遷到新地址http://blog.csdn.net/elim168

該部落格使用部落格搬家功能從http://haohaoxuexi.iteye.com搬遷過來,發現搬遷過來的效果不好,決定陸續手動搬遷到新地址http://blog.csdn.net/elim168...

部落地址永久遷移到】http://zhengxiaoyong.me

顧名思義,AndroidEventBus是一個Android平臺的事件匯流排框架,它簡化了Activity、Fragment、Service等元件之間的互動,很大程度上降低了它們之間的耦合,使我們的程式碼更加簡潔,耦合性更低,提升了我們的程式碼質量。但它能做的卻不僅限

Spring Boot 攔截器無效不起作用; 原文https://blog.csdn.net/u012862619/article/details/81557779

在Spring MVC中,攔截器有兩種寫法:要麼實現HandlerInterceptor介面,要麼實現WebRequestInterceptor介面,具體內容請看這裡詳述 Spring MVC 框架中攔截器 Interceptor 的使用方法。  而Spring Boot也只是集成了Spr

基於layer mobile手機端彈出框詢問框(PC端推薦layer和artDialoghttp://download.csdn.net/download/cometwo/9437895)

            FastClick.attach(document.body);            $(function() {                $('.btn1').click(function() {                    layer.open({        

部落搬往 http://begtostudy.cnblogs.com】不要在這個部落發表評論抗議CSDN隨意刪除我部落元件和博文廢棄部落不再回復!

Dr. Ing. 白途思(Begtostudy) 微訊號:Begtostudy QQ:370566617 Email: [email protected] 點選這裡給我發郵件 工作單位:上海航天技術研究院 身份:上海交通大學 工學博士 校內名片

部落停止維護和更新已轉移https://github.com/ilvseyinfu/blog

14 + 16 單選+不定項 感覺選擇考的還是比較基礎的,cookie / 本地儲存 / 網路協議 / CSS3新特性 / HTML5新元素 剩下的記不起來了,對了還考了Vue和react 程式設計題2道,第二道沒時間看了,剛開始還覺得時間很充裕,然後就卡到第一道程式設計

STL(大量部落蒐集整理持續更新)

轉:STL在ACM中的應用 STL 提供三種類型的元件:容器、迭代器和演算法,它們都支援泛型程式設計標準。在ACM中充分利用STL可以大大的簡化程式,提高解題效率。 1、容器主要有兩類:順序容器和關聯容器。順序容器(vector/list/deque/string)等是一系列元素的有序集合。

arcgis10.0以後版本已知座標生成shp檔案 ---經驗證部落記錄步驟較繁瑣ArcGIS Desktop有更簡單的方法

arcgis10.0以後版本沒有Write Features To Text File,Create Features From Text File首先要生成這兩個工具,參考連結如下:http://wenku.baidu.com/link?url=3-WqIKo00_KbG9