成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

關于AsyncTask 你必須要了解的一些事情

移動開發 Android
AsyncTask是android給我們封裝的一套異步消息處理工具。使用這個工具,可以讓異步消息的處理變得更加的簡單,開發者避免了很多的麻煩。也就是說AsyncTak天生用來被設計做兩件事:

大家都知道,在子線程中是不能更新UI的,必須要采用異步消息處理機制。一般的做法就是在有需要的地方,使用Handler發送消息給主線程,然后在主線程中處理消息更新UI。如果好多子線程都有更新UI的需求,那么場面就有點難以控制了,大家必須在代碼中手動處理Handler的消息請求。這樣子問題顯然會復雜很多。其實這樣子的情況android已經為我們考慮到了。AsyncTask就是天生被android設計出來為我們解決這樣子的問題的。其實翻看源碼,就會知道AsyncTask的底層封裝的仍然是android的Handler消息處理機制。下面的幾篇文章就來詳細的學習什么是AsyncTask,以及它是如何做的。

一、AsyncTask是什么

AsyncTask是android給我們封裝的一套異步消息處理工具。使用這個工具,可以讓異步消息的處理變得更加的簡單,開發者避免了很多的麻煩。也就是說AsyncTak天生用來被設計做兩件事:

(1)子線程中更新UI

 

(2)異步加載數據

 

下面來學習一下關于它的最基礎的知識。

首先AsyncTask是一個抽象類,必須要創建它的子類。但是在繼承AsyncTask類的時候,需要指定三個泛型參數。解釋分別如下:

  • (1)Params
  • 在執行AsyncTask時需要傳入的參數,可用于在后臺任務中使用。
  • (2)Progress
  • 后臺任務在執行時,如果需要在界面上顯示當前進度,則就用Progress指定的泛型作為進度單位。
  • (3)Result
  • 當后臺任務執行完畢后,如果需要對結果進行返回,那么就用這里指定的泛型作為返回的類型。

然后一般在子類中,需要重寫下面的幾個回調方法,他們都是自動被調用的,不要在代碼中人工調用。

 

  1. 1)onPreExexute() 
  2. 該方法在后臺任務執行前,即doInBackground方法執行前被調用。通常在這里執行一些初始化的操作,比如顯示一個進度條。 
  3. 2)doInBackground(Params...) 
  4. 該方法用來執行后臺任務,它的所有代碼都是在子線程中操作,任務一旦完成就會用return來返回結果。當然它的參數和返回結果的類型就是上面我們所指定的Params和Result。千萬注意,不要在這個 
  5. 方法中執行更新UI的操作。如果需要更新UI元素,比如說反饋當前任務的進度,可以調用publishProgress(Progress...)方法來完成。 
  6. 3)onProgressUpdate(Progress...) 
  7. 當在后臺任務中調用了publishProgress方法后,就會自動調用該方法,方法中的參數就是publishProgress方法傳遞過來的。這個方法可以對UI進行更新。 
  8. 4)onPostExecute(Result) 
  9. 當后臺任務執行完畢,即doInBackground執行完畢后,該方法被調用。doInBackground返回的結果就是該方法的參數,這這里可以執行任務完成后的邏輯,比如說關閉一個進度條,更新一些UI等。 

需要說明的是這幾個方法,只有doInBackground方法是在子線程中執行的,其他的都是在主線程中執行的。那么啟動和取消這個任務的方法是什么呢?如下:

 

  1. myAsyncTask.execute() 其中該任務 
  2.  
  3. yAsyncTask.cancel() 取消該任務 

 

 

好了,了解到上面的基礎知識后,我們來做一個小練習,加深一下印象。

二、一個實際練習

我們來編寫出一個AsynTask子類,實際運行一下吧。新建項目,然后新建子類繼承自AsynTask,代碼如下:

 

  1.  1 package com.example.asynctasktest; 
  2. 2 
  3. 3 import android.os.AsyncTask; 
  4. 4 import android.util.Log; 
  5. 5 
  6. 6 
  7. 7 
  8. 8 public class MyAsyncTask extends AsyncTask<Void, Void, Void>{ 
  9. 9 
  10. 10 
  11. 11 
  12. 12 protected Void doInBackground(Void... params) { 
  13. 13 Log.d("付勇焜----->","doInBackground"); 
  14. publishProgress(); 
  15. 14 return null
  16. 15 } 
  17. 16 
  18. 17 
  19. 18 protected void onPreExecute() { 
  20. 19 Log.d("付勇焜----->","onPreExecute"); 
  21. 20 super.onPreExecute(); 
  22. 21 } 
  23. 22 
  24. 23 
  25. 24 protected void onPostExecute(Void result) { 
  26. 25 Log.d("付勇焜----->","onPostExecute"); 
  27. 26 super.onPostExecute(result); 
  28. 27 } 
  29. 28 
  30. 29 
  31. 30 protected void onProgressUpdate(Void... values) { 
  32. 31 Log.d("付勇焜----->","onProgressUpdate"); 
  33. 32 super.onProgressUpdate(values); 
  34. 33 } 
  35. 34 
  36. 35 
  37. 36 
  38. 37 } 

 

我們編寫了一個最簡單的AsyncTask子類,傳入的參數都是空值, 然后在每一個方法中都打印出一句話,主要是為了便于觀察他們的執行順序。

然后我們再修改MainActivity的代碼,如下:

 

  1. 1 package com.example.asynctasktest; 
  2. 2 
  3. 3 import android.os.Bundle; 
  4. 4 import android.app.Activity; 
  5. 5 
  6. 6 
  7. 7 public class MainActivity extends Activity { 
  8. 8 
  9. 9 
  10. 10 protected void onCreate(Bundle savedInstanceState) { 
  11. 11 super.onCreate(savedInstanceState); 
  12. 12 setContentView(R.layout.activity_main); 
  13. 13 
  14. 14 MyAsyncTask mTask = new MyAsyncTask(); 
  15. 15 mTask.execute(); 
  16. 16 } 
  17. 17 
  18. 18 }

     

然后運行程序,打印結果如下:

從打印的結果很容易就看出方法的執行順序了吧。如下:

onPreExecute------>onProgressUpdate(調用了publishProgress方法才會調用該方法)------->doInBackground--------->onPostExecute

 

好了,本篇文章帶你大致了解了一下AsynTask的基礎知識,那么在下一篇文章中,就一起來做一個實際例子吧,熟練使用AsynTask這套機制!

責任編輯:chenqingxiang 來源: fuly_android的博客
相關推薦

2018-11-08 12:07:38

備份手動磁盤

2018-09-21 11:11:34

備份離線自動

2021-06-07 11:33:24

服務器優化TIME-WAIT

2023-04-26 16:34:12

2017-02-09 14:46:25

Git事情

2011-12-14 16:43:54

javanio

2013-07-31 11:05:05

硬件處理ITM硬件

2019-06-05 15:43:46

固態硬盤PC

2016-12-23 08:59:00

AB 測試CRO

2011-06-23 17:13:07

SEO

2018-11-28 10:00:42

React組件前端

2021-04-27 22:27:19

手機安卓蘋果

2016-11-14 15:30:49

阿里百川HotFix

2016-12-19 16:47:13

阿里百川HotFix

2017-10-29 06:50:30

前端開發CSSWeb

2019-09-03 15:33:35

網絡安全保險網絡安全網絡攻擊

2021-08-09 14:40:02

物聯網IOT智能家居

2020-04-28 18:20:04

Ubuntu 20.0UbuntuLinux

2022-01-26 23:16:25

開源NLP 庫GitHub

2022-06-08 08:03:51

React.jsReactJS 庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲成人一区二区 | 日本超碰 | 久久999| 日韩欧美在线观看视频 | 精品国产一区二区三区久久久蜜月 | 欧美国产激情 | 九九久久国产 | 视频一区二区三区中文字幕 | 五月天国产在线 | 日韩中文字幕网 | 国产一区二区a | 青青草社区 | 久久国产精品免费视频 | 国产一区二区在线看 | 亚洲精品在线观 | 国产精品久久久久久久久久免费看 | 影音先锋中文字幕在线观看 | 91国自产 | 精品在线一区 | 老熟女毛片 | 日本黄色片免费在线观看 | 欧美乱大交xxxxx另类电影 | 欧美在线一区二区三区 | 久久久久久久久久久一区二区 | 国产一区二区三区久久久久久久久 | 亚洲区一区二区 | 中文字幕一区二区三区精彩视频 | 日日夜夜精品视频 | 欧美日韩久久精品 | 99精品一区二区三区 | 91在线色视频 | 久久久国产精品 | 91精品国产综合久久久密闭 | 91精品在线观看入口 | 毛片在线免费播放 | 亚洲人成一区二区三区性色 | 夜夜夜操| 麻豆av一区二区三区久久 | 日韩精品在线一区 | 国产精品高潮呻吟 | 97国产一区二区 |