同步和非同步的概念區別: 同步,必須執行完成某個問題後才能繼續執行其他的。 非同步,我會去先執行其他問題,你執行完之後返回給我一個結果就可以。 android中為什麼要引用非同步任務呢 android啟動的,會啟動一個線程也稱為主線程,UI線程,但是我們不能把所有耗時的任務交給主線程來完成,這樣會影響用戶 ...
同步和非同步的概念區別:
同步,必須執行完成某個問題後才能繼續執行其他的。
非同步,我會去先執行其他問題,你執行完之後返回給我一個結果就可以。
android中為什麼要引用非同步任務呢
android啟動的,會啟動一個線程也稱為主線程,UI線程,但是我們不能把所有耗時的任務交給主線程來完成,這樣會影響用戶的體驗,也就是說我們要另外的開闢新的線程來執行我們的任務,
但是在android中,(載入圖片,網路編程都屬於耗時的操作),在android4.0後規定禁止在主線程中完成網路操作,所以說這些耗時的任務要交給子線程,
問題,子線程中是不能進行ui操作的,只有作為主線程的ui線程才能夠進行ui操作,那麼我們怎麼講信息返回給用戶呢。
方式1.我們可以通過handler,在handler中寫好了跟新的操作,在子線程中調用sendmessage通知我們的handler跟新ui
方式2.利用Activity.runonUIThread(Runnable)進行子線程到ui線程的切換。
為什麼要是用AsyncTask?
很簡單,人都是很懶的,使用上述的兩種方式操作麻煩,所以大佬們就封裝了一個非同步執行的方法,便於我們直接處理耗時邏輯,更新UI.
我們一般用它完成網路操作,圖片載入,數據傳輸等操作。(當然後續我們會選擇我們的第三方的框架來完成)
Asynctask的基本使用:
首先它是一個抽象類,也就是說我們要重寫他的方法然後在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基礎知識對應文章。如果有興趣推薦大家可去閱讀。