深入認識AsyncTask

2021-07-15 17:48:10 字數 1853 閱讀 8222

首先我要說的是網上有很多關於aysnctask的文章,這裡我就不累贅重複做過多的基本介紹qaq,所以我就從側面闡述我對aysnctask的一些認識。

我們都知道android官方為了讓建立非同步任務更簡單,把handler和thread封裝成aysnctask。

所謂三核心,就是三個核心方法:

aysnctask從execute開始執行:

public final asynctaskexecute(params... params) 

public final asynctaskexecuteonexecutor(executor exec,

params... params)

}mstatus = status.running;

//所以onpreexecute先執行

onpreexecute();

mworker.mparams = params;

exec.execute(mfuture);

return

this;

}

忽略複雜的部分,可以知道在execute的時候最先呼叫的是onpreexecute方法,所以可以在這裡面做一些初始化的操作。

看一下,構造方法:

public

asynctask()

};mfuture = new futuretask(mworker) catch (interruptedexception e) catch (executionexception e) catch (cancellationexception e) }};

}

private

static

class

internalhandler

extends

handler

@suppresswarnings()

@override

public

void

handlemessage(message msg)

}}

handler處理message_post_result訊息執行finish方法

private

void

finish(result result) else

mstatus = status.finished;

}

在finish方法中會呼叫onpostexecute,整個工作流程就差不多了。

一般的我們可以new乙個子執行緒然後通過handler來更新ui,那為什麼還用使用aysnctask呢?

想象一台機器,通過thread和handler就像開啟機器內部修改各種零件,這種方法對於整個過程的控制比較精細,通過aysnctask就像坐在控制台指揮機器工作一樣,使得非同步建立更加簡單,**不會相對臃腫。

但是aysnctask並不適合進行特別耗時的操作,在更新ui特別是大量的itemview的時候也不是很給力。

執行緒池是非同步操作的重要方式,但是自行實現乙個執行緒池並不容易,因為你需要解決死鎖,資源分配,wait和notify等複雜問題,因此android官方為我們封裝的aysnctask使我們更容易實現輕量級,簡單的自定義非同步類。

下面是幾點需要注意的:

aysnctask的物件必須在主線程中建立,execute方法必須在ui執行緒中呼叫。

乙個aysnctask物件只能執行一次,只能呼叫一次execute方法,否則報錯。

在android3.0之後,為避免併發錯誤aysnctask採用乙個執行緒序列執行任務。

不能在doinbackground中更新ui,也不要在onpostexecute中大量更新ui。

深入研究AsyncTask

asynctask提供了一種在後台執行操作而在ui執行緒顯示結果的方式,而且開發者不必操作執行緒或者handler.乙個asynctask定義了三種泛型分別是params,progress,result,還有四個函式分別是onpreexecute doinbackground onprogressu...

深入理解AsyncTask

眾所周知,在android中如果要執行耗時的操作,一般是在子執行緒中處理,使用new thread的方法實現是最常見的方法之一。今天,我們要講的是另外乙個,android提供的非同步任務類asynctask,底層是使用執行緒池實現的。一 android的執行緒 執行緒是作業系統的最小執行單位,它的建...

深入認識CPU

學習彙編的時候,對cpu的認識有助於對組合語言的理解,因為組合語言功能可以直接對cpu中的暫存器進行操作。以8086cpu為例子,8086cpu是16位的,那麼16位cpu具有哪些性質呢?1.cpu組成 2.使用暫存器 組合語言中使用的最多的就是暫存器,如何正確的使用暫存器,就要知道各種暫存器的作用...