同步,必須執行完成某個問題後才能繼續執行其餘的。java
異步,我會去先執行其餘問題,你執行完以後返回給我一個結果就能夠。android
android啓動的,會啓動一個線程也稱爲主線程,UI線程,可是咱們不能把全部耗時的任務交給主線程來完成,這樣會影響用戶的體驗,也就是說咱們要另外的開闢新的線程來執行咱們的任務,編程
可是在android中,(加載圖片,網絡編程都屬於耗時的操做),在android4.0後規定禁止在主線程中完成網絡操做,因此說這些耗時的任務要交給子線程,網絡
問題,子線程中是不能進行ui操做的,只有做爲主線程的ui線程纔可以進行ui操做,那麼咱們怎麼講信息返回給用戶呢。框架
方式1.咱們能夠經過handler,在handler中寫好了跟新的操做,在子線程中調用sendmessage通知咱們的handler跟新ui異步
方式2.利用Activity.runonUIThread(Runnable)進行子線程到ui線程的切換。ide
很簡單,人都是很懶的,使用上述的兩種方式操做麻煩,因此大佬們就封裝了一個異步執行的方法,便於咱們直接處理耗時邏輯,更新UI.ui
咱們通常用它完成網絡操做,圖片加載,數據傳輸等操做。(固然後續咱們會選擇咱們的第三方的框架來完成)url
Asynctask的基本使用:spa
首先它是一個抽象類,也就是說咱們要重寫他的方法而後在new
AsyncTask<Params,progress,result>
parames:啓動任務的時候執行的參數,好比傳入的url
Progress:後臺執行進度的百分比單位
result:執行完異步操做後返回的結果
(與handler相比,他的後臺是一個線程池,再數據龐大的時候回體現出優點)
AsyncTask的幾個重要的方法
@Override protected void onPreExecute() { super.onPreExecute(); }
//執行耗時操做以前調用的一個方法,至關於咱們的初始化的方法
注意該該方法是運行在ui線程中的
@Override protected String doInBackground(String... params) { return null; }
該方負責執行咱們耗時的業務邏輯操做,也就是說他是在子線程中運行的,若是想要更新ui怎麼辦
調用的咱們的publicProgress方法能夠更新咱們的ui,此方法是在子線程中運行的
publishProgress(Object o);
此方法表示更新咱們的進度,可用於更新下載的進度條等。
@Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); }
此方法是在主線程中執行的方法,一旦咱們在耗時邏輯代碼中調用了publicProgress就表示咱們但願更新進度條。
此時就會調用這個方法到ui線程跟新咱們的進度條。
注意:task實例必須在ui線程中建立 task.excute(初始參數好比url);
咱們無需手動的調用task中的方法
task只能被執行一次
文章參考csdn小豬的android基礎知識對應文章。若是有興趣推薦你們可去閱讀。