您好,登錄后才能下訂單哦!
本篇文章為大家展示了AsyncTask的原理和知識是什么,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
大家都知道,在子線程中是不能更新UI的,必須要采用異步消息處理機制。一般的做法就是在有需要的地方,使用Handler發(fā)送消息給主線程,然后在主線程中處理消息更新UI。如果好多子線程都有更新UI的需求,那么場面就有點難以控制了,大家必須在代碼中手動處理Handler的消息請求。這樣子問題顯然會復(fù)雜很多。其實這樣子的情況android已經(jīng)為我們考慮到了。AsyncTask就是天生被android設(shè)計出來為我們解決這樣子的問題的。其實翻看源碼,就會知道AsyncTask的底層封裝的仍然是android的Handler消息處理機制。
一、AsyncTask是什么
AsyncTask是android給我們封裝的一套異步消息處理工具。使用這個工具,可以讓異步消息的處理變得更加的簡單,開發(fā)者避免了很多的麻煩。也就是說AsyncTak天生用來被設(shè)計做兩件事:
(1)子線程中更新UI
(2)異步加載數(shù)據(jù)
下面來學習一下關(guān)于它的最基礎(chǔ)的知識。
首先AsyncTask是一個抽象類,必須要創(chuàng)建它的子類。但是在繼承AsyncTask類的時候,需要指定三個泛型參數(shù)。解釋分別如下:
(1)Params
在執(zhí)行AsyncTask時需要傳入的參數(shù),可用于在后臺任務(wù)中使用。
(2)Progress
后臺任務(wù)在執(zhí)行時,如果需要在界面上顯示當前進度,則就用Progress指定的泛型作為進度單位。
(3)Result
當后臺任務(wù)執(zhí)行完畢后,如果需要對結(jié)果進行返回,那么就用這里指定的泛型作為返回的類型。
然后一般在子類中,需要重寫下面的幾個回調(diào)方法,他們都是自動被調(diào)用的,不要在代碼中人工調(diào)用。
(1)onPreExexute() 該方法在后臺任務(wù)執(zhí)行前,即doInBackground方法執(zhí)行前被調(diào)用。通常在這里執(zhí)行一些初始化的操作,比如顯示一個進度條。 (2)doInBackground(Params...) 該方法用來執(zhí)行后臺任務(wù),它的所有代碼都是在子線程中操作,任務(wù)一旦完成就會用return來返回結(jié)果。當然它的參數(shù)和返回結(jié)果的類型就是上面我們所指定的Params和Result。千萬注意,不要在這個 方法中執(zhí)行更新UI的操作。如果需要更新UI元素,比如說反饋當前任務(wù)的進度,可以調(diào)用publishProgress(Progress...)方法來完成。 (3)onProgressUpdate(Progress...) 當在后臺任務(wù)中調(diào)用了publishProgress方法后,就會自動調(diào)用該方法,方法中的參數(shù)就是publishProgress方法傳遞過來的。這個方法可以對UI進行更新。 (4)onPostExecute(Result) 當后臺任務(wù)執(zhí)行完畢,即doInBackground執(zhí)行完畢后,該方法被調(diào)用。doInBackground返回的結(jié)果就是該方法的參數(shù),這這里可以執(zhí)行任務(wù)完成后的邏輯,比如說關(guān)閉一個進度條,更新一些UI等。
需要說明的是這幾個方法,只有doInBackground方法是在子線程中執(zhí)行的,其他的都是在主線程中執(zhí)行的。那么啟動和取消這個任務(wù)的方法是什么呢?如下:
myAsyncTask.execute() 其中該任務(wù) yAsyncTask.cancel() 取消該任務(wù)
好了,了解到上面的基礎(chǔ)知識后,我們來做一個小練習,加深一下印象。
二、一個實際練習
我們來編寫出一個AsynTask子類,實際運行一下吧。新建項目,然后新建子類繼承自AsynTask,代碼如下:
1 package com.example.asynctasktest; 2 3 import android.os.AsyncTask; 4 import android.util.Log; 5 6 7 8 public class MyAsyncTask extends AsyncTask<Void, Void, Void>{ 9 10 11 12 protected Void doInBackground(Void... params) { 13 Log.d("付勇焜----->","doInBackground"); publishProgress(); 14 return null; 15 } 16 17 18 protected void onPreExecute() { 19 Log.d("付勇焜----->","onPreExecute"); 20 super.onPreExecute(); 21 } 22 23 24 protected void onPostExecute(Void result) { 25 Log.d("付勇焜----->","onPostExecute"); 26 super.onPostExecute(result); 27 } 28 29 30 protected void onProgressUpdate(Void... values) { 31 Log.d("付勇焜----->","onProgressUpdate"); 32 super.onProgressUpdate(values); 33 } 34 35 36 37 }
我們編寫了一個最簡單的AsyncTask子類,傳入的參數(shù)都是空值, 然后在每一個方法中都打印出一句話,主要是為了便于觀察他們的執(zhí)行順序。
然后我們再修改MainActivity的代碼,如下:
1 package com.example.asynctasktest; 2 3 import android.os.Bundle; 4 import android.app.Activity; 5 6 7 public class MainActivity extends Activity { 8 9 10 protected void onCreate(Bundle savedInstanceState) { 11 super.onCreate(savedInstanceState); 12 setContentView(R.layout.activity_main); 13 14 MyAsyncTask mTask = new MyAsyncTask(); 15 mTask.execute(); 16 } 17 18 }
然后運行程序,打印結(jié)果如下:
從打印的結(jié)果很容易就看出方法的執(zhí)行順序了吧。如下:
onPreExecute------>onProgressUpdate(調(diào)用了publishProgress方法才會調(diào)用該方法)------->doInBackground--------->onPostExecute
上述內(nèi)容就是AsyncTask的原理和知識是什么,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。