一、非同步任務載入網路資料:
在android
中提供了乙個非同步任務的類
asynctask
,簡單來說,這個類中的任務是執行在後台執行緒中的,並可以將結果放到
ui執行緒中進行處理,它定義了三種泛型,分別是
params
、progress
和result
,分別表示請求的引數、任務的進度和獲得的結果資料。
1、使用原因:
1)是其中使用了執行緒池技術,而且其中的方法很容易實現呼叫
2)可以呼叫相關的方法,在開啟子執行緒前和後,進行介面的更新
3)一旦任務多了,不用每次都
new新的執行緒,可以直接使用
2、執行的順序:
onpreexecute()【執行前開啟】
--- > doinbackground() --- > onprogressupdate() --- > onpostexecute()
3、執行過程:
當乙個非同步任務開啟後,執行過程如下:
1)、onpreexecute():
這個方法是執行在主線程中的。這步操作是用於準備好任務的,作為任務載入的準備工作。建議在這個方法中彈出乙個提示框。
2)、doinbackground():
這個方法是執行在子執行緒中的。在onpreexecute()
執行完後,會立即開啟這個方法,在方法中可以執行耗時的操作。需要將請求的引數傳遞進來,傳送給伺服器,並將獲取到的資料返回,資料會傳給最後一步中;這些值都將被放到主線程中,也可以不斷的傳遞給下一步的onprogressupdate()中進行更新。可以通過不斷呼叫publishprogress(),將資料(或進度)不斷傳遞給onprogressupdate()方法,進行不斷更新介面。
3)、onprogressupdate():
這個方法是執行在主線程中的。publishprogress()在
doinbackground()
中被呼叫後,才開啟的這個方法,它在何時被開啟是不確定的,執行這個方法的過程中,
doinbackground()
是仍在執行的,即子執行緒還在執行著。
4)、onpostexecute():
這個方法是執行在主線程中的。當後台的子執行緒執行完畢後才呼叫此方法。doinbackground()
返回的結果會作為引數被傳遞過來。可以在這個方法中進行更新介面的操作。
5)、execute():
最後建立asynctask
自定義的類,開啟非同步任務。
3、實現原理:
1)、執行緒池的建立:
在建立了asynctask
的時候,會預設建立乙個執行緒池threadpoolexecutor,並預設建立出5
個執行緒放入到執行緒池中,最多可防
128個執行緒;且這個執行緒池是公共的唯一乙份。
2)、任務的執行:
在execute
中,會執行
run方法,當執行完
run方法後,會呼叫schedulenext()不斷的從雙端佇列中輪詢,獲取下乙個任務並繼續放到乙個子執行緒中執行,直到非同步任務執行完畢。
3)、訊息的處理:
在執行完onpreexecute()
方法之後,執行了
doinbackground()
方法,然後就不斷的傳送請求獲取資料;在這個
asynctask
中維護了乙個internalhandler的類,這個類是繼承handler
的,獲取的資料是通過
handler
進行處理和傳送的。在其
handlemessage
方法中,將訊息傳遞給onprogressupdate()進行進度的更新,也就可以將結果傳送到主線程中,進行介面的更新了。
4、需要注意的是:
①、這個asynctask
類必須由子類呼叫
②、雖然是放在子執行緒中執行的操作,但是不建議做特別耗時的操作,如果操作過於耗時,建議使用執行緒池threadpoolexecutor和futuretask
private class downloadfilestask extends asynctask
return totalsize;
}protected void onprogressupdate(integer... progress)
protected void onpostexecute(long result)
}new downloadfilestask().execute(url1, url2, url3);
AsyncTask非同步載入 原生解析
解析 新增到集合 展示 public class tab fragment hu extends basefragment override protected void initview view view override protected void initdata 下拉載入 private...
AsyncTask非同步任務載入網路資料
asynctask就是非同步載入網路資料。跟那個new乙個子執行緒載入資料一樣。用了這個 asynctask就不需要再new子執行緒了,裡面有乙個執行緒池,最多開五個執行緒。在android 中提供了乙個非同步任務的類 asynctask 簡單來說,這個類中的任務是執行在後台執行緒中的,並可以將結果...
AsyncTask 非同步處理
1,object,用於指定doinbackground的引數 2,integer,用於指定onprogressupdate的引數 3,uri,用於指定doinbackground的返回型別和onpostexecute的引數型別 public class updatetask extends asyn...