asynctask就是非同步載入網路資料。跟那個new乙個子執行緒載入資料一樣。用了這個
asynctask就不需要再new子執行緒了,裡面有乙個執行緒池,最多開五個執行緒。。
在android
中提供了乙個非同步任務的類
asynctask
,簡單來說,這個類中的任務是執行在後台執行緒中的,並可以將結果放到
ui執行緒中進行處理,它定義了三種泛型,分別是
params
、progress
和result
,分別表示請求的引數、任務的進度和獲得的結果資料。
我之前總結了使用非同步任務的原因有三點:
1)是因為
asynctask
使用了執行緒池技術,而且其中的方法很容易實現呼叫
2)是因為
asynctask
可以呼叫相關的方法,在開啟子執行緒前和後,進行介面的更新
3)是因為一旦任務多了,不用每次都
new新的執行緒,可以直接使用
如果我們檢視官方文件
,非同步任務中的方法的執行順序是這樣的:
onpreexecute()【執行前開啟】
--- > doinbackground() --- > onprogressupdate
() --- > onpostexecute()
具體的來說
,當乙個非同步任務開啟後:
首先會呼叫
onpreexecute()
方法:
這個方法
在非同步執行時立即被ui執行緒呼叫,這一步通常用來設定任務
,作為任務載入的準備工作。通常會在這個方法中彈出乙個提示框,提示使用者載入的進度。
第二個方法
doinbackground():
這個方法是執行在子執行緒中的。在
onpreexecute()
執行完後,會立即開啟這個方法,在方法中可以執行耗時的操作。需要將請求的引數傳遞進來,傳送給伺服器,並將獲取到的資料返回,資料會傳給最後一步中;這些值都將被放到主線程中,也可以不斷的傳遞給下一步的
onprogressupdate
()中進行更新。可以通過不斷呼叫
publishprogress
(),將資料(或進度)不斷傳遞給
onprogressupdate
()方法,進行不斷更新介面。
3)、onprogressupdate
():
這個方法是執行在主線程中的。
publishprogress
()在被呼叫後,才開啟的這個方法,它在何時被開啟是不確定的,
這個方法用來在後台操作仍在執行的時候在使用者介面顯示不同形式的進度。比如它可以推動進度條進度或者在文字裡顯示log資訊。
4)、onpostexecute():
這個方法是執行在主線程中的。當後台的子執行緒執行完畢後才呼叫此方法。
doinbackground()
返回的結果會作為引數被傳遞過來。可以在這個方法中進行更新介面的操作。
最後建立
asynctask
自定義的類,呼叫
execute
()方法開啟非同步任務。
結合專案:
我們在使用非同步任務的時候
,根據這些原理和步驟就可以了
,我們在做專案時會經常使用到非同步任務
,比如說我在做彩票的這個專案中
,有乙個部分
,是購彩大廳中的銷售期號和截止時間
,我這裡使用非同步獲取這個彩種的當前的銷售資訊.
我在實現乙個功能的時候總會先想到三個問題
,我們要實現什麼
?我們要怎麼實現
?我們為什麼這樣實現?
首先我們要實現什麼呢
?就是從伺服器上獲取到當前的銷售資訊.
那麼我們要怎麼實現呢
?首先我們得在購彩大廳這個類中增加乙個獲取當前銷售資訊的方法
,這個方法會到伺服器中去獲取資料
.然後我先想到的是在這個方法中開啟乙個執行緒
,在這個執行緒中實現訪問網路的操作
,由於我們做了訪問網路的操作,所以在開啟這個執行緒的時候還要判斷一下網路。新增判斷網路的**之後,我又發現,每次訪問網路的時候,我們都要實現這幾行**。解決這個問題
,我是在
getcurrentissueinfo
中,只保留了
new mythread().start(),
而把判斷網路這一步放到
mythread
中的start()中去.
這時候,當在
getcurrentissueinfo
中start
的時候,會呼叫新執行緒的
start()
方法,這裡的
super.start()
就是方法中的
start
,如果聯絡連線好則執行這個start,然後呼叫run方法,執行網路的操作;否則,就彈出沒有網路的提示資訊。
這是實現這個功能的一種方式
,但是我有考慮到使用系統提供的
asynctask
比thread
的效率更高
,因此我又改用了
asynctask
的方式來實現從伺服器上獲取當前的銷售資訊.
建立非同步任務類後
,先覆寫
doinbackground方法,
這個方法相當於
thread
中的run方法,
開啟非同步任務就要呼叫
execute方法,
它和thread
的start
方法類似.
在非同步任務處理中加入
execute方法,
但是我在檢視
asynctask
源**的時候發現這個方法是
final
修飾的,
因此我們沒辦法
override
這個方法
,我的處理方式是把這個方法複製過來,既然沒辦法
override
,就修改這個方法來使用
.我們的目的是判斷網路,所以在這個方法中加上網路判斷語句就可以了.
然後在這個任務中增加在
ui執行緒的操作:得複寫
onpre
execute
和onpostexecute
兩個方法,這兩個方法是在
ui執行緒中執行的,就避免了使用
handler
(因為使用
handler發訊息處理
,**很臃腫)。
這樣,非同步任務處理的殼子就寫出來了,下一步要做到就是在裡面寫任務。
我們建立乙個處理公共資訊的業務操作介面,在裡面定義乙個根據期號獲取當前銷售期的方法。然後把這個介面的實現類給定義出來,獲取到伺服器中的資訊之後,在
onpostexecute
方法中判斷返回的資訊是否為空,如果為空就提示使用者伺服器忙,否則就更新介面,把獲取的資訊在介面中顯示出來。
這樣處理我還遇到了個問題,我這個獲取當前銷售資訊的方法是放在購彩大廳類的建構函式中呼叫的,這個方法就只能被呼叫一次,而我們要求它時刻變化,這個時候我們就需要做出改變。我想到了兩種處理的方案,一種是使用倒計時的方法——每秒重新整理一次,第二種是每次進入到購彩大廳的時候,都到伺服器端去獲取資料。使用第二種比較方便,這時候我想要借鑑
activity
生命週期的方法,(進來時呼叫
onstart
、onresume
、出去時呼叫
onpause)。
我在這個介面中增加兩個方法
onresume
和onpause,
對於onresume
是在進入到介面的時候,介面內容的修改,處理耗費資源操作,在
onpause
方法中**資源
在介面管理的類中,加入介面後,就呼叫
onresume
方法進行介面內容的修改。同時,在移除
view
的之前,要進行耗資源內容的移除。要做的是先判斷是不是第乙個
view
,如果不是,則可能會有耗資源的內容,就在
onpause
中進行耗資源的操作。
這時候就可以把獲取銷售資訊的方法從建構函式中轉移到
onresume
中。這樣就完成了獲取銷售資訊的功能。
AsyncTask非同步載入
一 非同步任務載入網路資料 在android 中提供了乙個非同步任務的類 asynctask 簡單來說,這個類中的任務是執行在後台執行緒中的,並可以將結果放到 ui執行緒中進行處理,它定義了三種泛型,分別是 params progress 和result 分別表示請求的引數 任務的進度和獲得的結果資...
AsyncTask非同步任務
asynctask非同步任務怎麼寫 寫乙個類繼承asynctask,重寫方法 doinbackgroud 再new 這個類,執行物件 execute 在ui執行緒裡面寫這個類的實現方法 doinbackground有可能是新開的執行緒,有可能是執行緒池裡面的執行緒 執行順序 onpreexecute...
非同步任務(AsyncTask)
一 解決新執行緒無法更新ui組建問題的方案 為了解決新執行緒不能更新ui組建的問題,andorid提供了如下幾種解決方案 1.使用handler實現執行緒之間的通訊。mhandler new handler public class mythread extends thread 2.activit...