1. 程式人生 > >請介紹下 AsyncTask 的內部實現,適用的場景,執行過程?

請介紹下 AsyncTask 的內部實現,適用的場景,執行過程?

AsyncTask 內部也是 Handler 機制來完成的,只不過 Android 提供了執行框架來提供執行緒池來執行相應地任務,因為執行緒池的大小問題,所以 AsyncTask 只應該用來執行耗時時間較短的任務,比如 HTTP 請求,大規模的下載和資料庫的更改不適用於 AsyncTask,因為會導致執行緒池堵塞,沒有執行緒來執行其他的任務,導致的情形是會發生 AsyncTask 根本執行不了的問題。

執行過程:

1、execute(Params... params),呼叫此方法來觸發非同步任務的執行。

2、onPreExecute(),在被呼叫後立即執行,用來在執行後臺任務前對UI做一些標記。
3、doInBackground(Params… params),在onPreExecute()完成後立即執行,用於執行較為費時的操作,此方法將接收輸入引數和返回計算結果。在執行過程中可以呼叫publishProgress(Progress… values)來更新進度資訊。
4、onProgressUpdate(Progress… values),在呼叫publishProgress(Progress… values)同時執行,直接將進度資訊更新到UI元件上。
5、onPostExecute(Result result),當後臺操作結束時呼叫,計算結果將做為引數傳遞到此方法中,直接將結果顯示到UI元件上。

AsyncTask 使用規則:

1、AsyncTask必須在UI Thread中載入;
2、AsyncTask例項必須在UI Thread中建立;
3、Execute(Params…)方法必須在UI Thread中呼叫;
4、不要手動呼叫onPreExecute,doInBackground,onProgressUpdate,onPostExecute;
5、Task只能被執行一次,之後再執行會異常。

相關推薦

介紹 AsyncTask內部實現適用場景執行過程

AsyncTask 內部也是 Handler 機制來完成的,只不過 Android 提供了執行框架來提供執行緒池來執行相應地任務,因為執行緒池的大小問題,所以 AsyncTask 只應該用來執行耗時時間較短的任務,比如 HTTP 請求,大規模的下載和資料庫的更改

介紹Android中常用的五種佈局

常用五種佈局方式,分別是:FrameLayout(框架佈局),LinearLayout (線性佈局),AbsoluteLayout(絕對佈局),RelativeLayout(相對佈局),TableLayout(表格佈局)。 LinearLayout: 線性佈

微信開發:微信js_sdk分享使用場景網頁在微信app內部分享時的標題與描述包括logo設置(一)

lap 判斷 bsp 準備 自己的 tp5 獲取 處理 圖片 主要有下面幾步。首先大家先分清楚 小程序的appid,appSecret 跟公眾號的appid,appSecret是不一樣的。因為這兩個都能拿到token,且是不同的值。 準備開始: 1.準備好 公眾號的appi

虛擬化的適用範圍和適用場景服務器虛擬化架構和功能

type 套件 enter 自動化 資源 ref 分配 產業 綠色 隨著企業的增長,部署在專用硬件的各種應用也隨之增多,這將給IT基礎架構帶來很多挑戰,例如資源使用效率低,業務部署費用高和周期長。因此IT部門會逐漸轉向采用雲計算來增加數據共享、提升資源利用率和減少運營成本;

常見排序演算法總結(實現原理穩定度使用場景時間複雜度)

快速排序是目前基於比較的內部排序中被認為是最好的方法,當待排序的關鍵字是隨機分佈時,快速排序的平均時間最短;堆排序所需的輔助空間少於快速排序,並且不會出現快速排序可能出現的最壞情況。這兩種排序都是不穩定的。若要求排序穩定,則可選用歸併排序。但本章介紹的從單個記錄起進行兩兩歸併的排序演算法並不值得提倡,通常可以

ThreadLocal 內部實現、應用場景和記憶體洩漏

一、什麼是ThreadLocal 首先明確一個概念,那就是ThreadLocal並不是用來併發控制訪問一個共同物件,而是為了給每個執行緒分配一個只屬於該執行緒的變數,顧名思義它是local variable(執行緒區域性變數)。它的功用非常簡單,就是為每

ThreadLocal 內部實現和應用場景

很多人都知道java中有ThreadLocal這個類,但是知道ThreadLocal這個類具體有什麼作用,然後適用什麼樣的業務場景還是很少的。今天我就嘗試以自己的理解,來講解下ThreadLocal類的內部實現和應用場景,如果有什麼不對之處,還望大家指正。 首先明確一個

常用資料結構與排序演算法實現適用場景及優缺點(Java)

1.下壓棧(後進先出)(能夠動態調整陣列大小的實現): package Chapter1_3Text; import java.util.Iterator; public class ResizingArrayStack<Item> implements

Action的實現方式和struts.xml配置的詳細解釋Struts2的簡單執行過程(二)

我把你的頭像,設定成我的名字,此刻你便與我同在。我把你的名字,寫進我的程式碼裡面,以後,我的世界便存在著你。         “兩個蝴蝶飛”特別喜歡"java1234知識分享網"小峰的實用主義,所以本文及其系列文章均是採用實用主義,

Zookeeper工作機制應用場景及安裝

Zookeeper 檔案系統 = 儲存資料 通知機制 = 監聽 功能     1、儲存資料:儲存叢集中每臺機器都關心的資料     2、監聽 zookeeper工作機制     基於觀察者模式設計的

RabbitMQ入門教程(概念應用場景安裝使用)

RabbitMQ 簡介 RabbitMQ是一個在AMQP(Advanced Message Queuing Protocol )基礎上實現的,可複用的企業訊息系統。它可以用於大型軟體系統各個模組之間的高效通訊,支援高併發,支援可擴充套件。 AMQP AMQP,即Advanced Mess

JavaScript 在vue頁面實現滑鼠拖拽div改變其大小適用於鷹眼地圖街景地圖等。

首先看效果,如圖,滑鼠懸浮在地圖的右上角小框中時,提示“拖動調整大小”,可以給小框加個好看的圖示。點選可以進行拖拽。 基於上一篇部落格:https://blog.csdn.net/acoolgiser/article/details/84866426  實現。 程式碼:

10行程式碼實現目標檢測這份教程

翻譯 | 林椿眄編輯 | 阿司匹林出品 | AI科技大本營(公眾號ID:rgznai100)作為人工智慧的

介紹京東的(選項卡中的選項卡)是怎麽實現

pad b- cti pre set red 二維數組 node int 我們都誰知道選項卡是通過數組實現的,那麽選項卡中的選項卡無非就是一個二維數組。 道理邏輯很簡單,下面是我實現的一個方法: 1 <!DOCTYPE html> 2 <html

實現一個函數將一個字符串中的空格替換成“%20”。例如當字符串為We Are Happy.則經過替換之後的字符串為We%20Are%20Happy。

gpo 字符串 wchar tostring OS src clas string image replace兩種用法:replace(int start,int end, String str) repla

最好的按鍵掃描和消抖方法適用於復合、長按、按或擡起響應按鍵

按鍵消抖 按鍵掃描 C語言按鍵 剛參加工作的時候,看了一些同事采用的按鍵掃描和消抖方法,對比學校裏和網上查到的按鍵處理,發現覺得不盡善盡美,有以下幾點: 1. 消抖復雜,效率低。有人直接在電平判斷後使用delay()函數,進行消抖,耽誤時間;有人在按鍵電平中斷中進行消抖和處理,導致其他的服務反應慢

樹形ztree 與angularjs結合實現級數據異步加載點擊復選框 填寫到輸入框裏

沒有 hide deb out IV UNC -s parent default html:<input value="" type="text" id="river_cut" onclick="

Kafka:ZK+Kafka+Spark Streaming集群環境搭建(二)VMW安裝四臺CentOS實現本機與它們能交互虛擬機內部實現可以上網。

centos 失敗 sco pan html top n 而且 div href Centos7出現異常:Failed to start LSB: Bring up/down networking. 按照《Kafka:ZK+Kafka+Spark Streaming集群環

實現一個裝飾器限制該函數被調用的頻率如10秒一次

空間 打包 函數作為參數 get false val orm cti res 一、通過函數的閉包/命名空間原理,裝飾器來實現這個功能 裝飾器及原理可參考我的這篇文章 這個裝飾器可以隨便設置時間很方便,每個函數都有獨立的標記時間 #!/usr/bin/env python #

Python的22個編程技巧

not 端口 con ces return 臨時 tlist 到你 pop 1. 原地交換兩個數字 Python 提供了一個直觀的在一行代碼中賦值與交換(變量值)的方法,請參見下面的示例: x,y= 10,20 print(x,y) x,y= y,x print(x,y)