AsyncTask的使用詳解

       我們都知道,android從4.0以後不能在主線程中直接訪問網絡,所以我們必須開啓子線程去請求網絡資源,並且通過handler發送消息給主線程並且更新UI,但是我們發現每次寫這些東西都很麻煩,這時候我們可以用Android給我們提供的AsyncTask來幫我們輕鬆的實現這些功能,他幫我們免去了開啓子線程的操作,並且提供在子線程中實時更新UI的方法,那麼現在就開始認識它吧~~~



這裏我寫了一個很常見的代碼,子線程中我用循環模擬了文件的下載,並且每秒發送一個消息給主線程,更新按鈕上的文本,那我們用AsyncTask是如何實現的呢?先看以下代碼:

在我們聲明對象的時候,我們可以看到,要用它需要給他指定三個泛型,這時候我們並不知道這三個泛型有什麼作用,但是我們爲了區別,我先隨便指定三中不同類型

因爲這個AsyncTask是一個抽象的類,這個你們自己點進去查看源代碼就可以看到,所以這裏我new了一個內部類,可以看到,需要實現一個方法doInBackground,顧名思義,這個方法是在後臺運行的,也就是說這個方法是在子線程中運行的

我們還可以發現這個方法的參數是一個字符串的可變數組,這是怎麼回事?查看源代碼!


發現這個方法是一個抽象類,類中的參數是一個參數個數可變的類型Params,那麼這個類型是什麼類型呢?


發現在類的聲明上我們可以看到這個Params的泛型,也就是說這個類型是我們繼承這個類的時候指定,繼承的時候指定什麼類型就是什麼類型.


也就是我們new 匿名內部類的時候指定第一個泛型爲String類型,所以我們實現的方法中也是String類型的.就是我們自己指定的!

接下來我們給方法加點料


我們也模擬下載一個文件,但是我們少了發送實時更新的消息,我們先運行一下,線程啓動用start()方法,而AsyncTask需要使用execute()方法


運行的結果是:


可以看到我們的代碼可以正常跑了,這個和我們平常使用的差不多吧?但是注意了,這裏我們執行的時候,是可以向方法doInBackground中傳遞參數的!


這裏我傳遞了一個字符串,爲什麼是字符串?因爲這是我們繼承的時候自己指定第一個參數是一個字符串類型的,爲了適應更多的情況,Android工程師將它設計成可變的參數,更加靈活的使我們傳遞更多的參數


可以看到我們可以正常拿到傳遞過去的數據,但是注意了,取的時候千萬要知道可變數組的個數是多少,不然很容易發生下標越界!

請關注我下一篇:AsyncTask的更新UI和處理任務執行的結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章