首先我要說的是網上有很多關於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.使用暫存器 組合語言中使用的最多的就是暫存器,如何正確的使用暫存器,就要知道各種暫存器的作用...