非同步任務(AsyncTask)

来源:http://www.cnblogs.com/haoxiaozhang/archive/2016/03/08/5254037.html
-Advertisement-
Play Games

Android的UI線程主要負責處理用戶的按鍵事件、用戶觸屏事件及屏幕繪圖事件等,因此開發者的其他操作不應該、也不能阻塞UI線程,否則UI界面將會變得停止響應——用戶感覺非常糟糕。(總之,開發者需要牢記:不要再UI線程中執行一些耗時的操作)。 為了避免UI線程失去響應的問題,Android建議將耗時


  Android的UI線程主要負責處理用戶的按鍵事件、用戶觸屏事件及屏幕繪圖事件等,因此開發者的其他操作不應該、也不能阻塞UI線程,否則UI界面將會變得停止響應——用戶感覺非常糟糕。(總之,開發者需要牢記:不要再UI線程中執行一些耗時的操作)。

  為了避免UI線程失去響應的問題,Android建議將耗時操作放在新線程中完成,但新線程也可能需要動態更新UI組件:比如需要從網上獲取一個網頁,然後再TextView中將其源代碼顯示出來,此時就應該將連接網路、獲取網路數據的操作放在新線程中完成。問題是:獲取網路數據之後,新線程不允許直接更新UI組件。

  為瞭解決新線程不能更新UI組件的問題,Android提供瞭如下幾種解決方案:

  1、使用Handler實現線程之間的通信.

  2、Activity.runOnUiThread(Runnable).

  3、View.post(Runnable).

  4、View.postDelayed(Runnable,long).

  後面三種方式可能導致編程略顯煩瑣,而非同步任務(AsyncTask)則可進一步簡化這種操作。

      AsyncTask<>是一個抽象類,通常用於被繼承,繼承 AsyncTask 時需要指定如下三個泛型參數。

  相對來說 AsyncTask 更輕量一些,適用於簡單的非同步處理,不需要藉助線程和Handler即可實現。

  AsyncTask<Params,Progress,Result>是抽象類,它定義瞭如下三種泛型類型。

    1、Params:啟動任務執行的輸入參數的類型

    2、Progress:後臺任務完成的進度值的類型

    3、Result:後臺執行任務完成後返回結果的類型。

  使用AsyncTask只要如下三步即可。

    1、創建 AsyncTask 的子類,併為三個泛型參數指定類型。如果某個泛型參數不需要指定類型,可將它指定為Void

    2、根據需要,實現 AsyncTask 的如下方法:

      2.1、doInBackground(Params...):重寫該方法就是後臺線程將要完成的任務。該方法可以調用publishProgress(Progress..values)方法更新任務的執行進度。

      2.2、onProgressUpdate(Progress...values):在doInBackground()方法中調用publishProgress()方法更新任務的執行進度後,將會觸發該方法。

      2.3、onPreExecute():該方法將在執行後臺耗時操作前被調用。通常該方法用於完成一些初始化的準備工作,比如在界面上顯示進度條等。

      2.4、onPostExecute(Result result):當doInBackground()完成後,系統會自動調用onPostExecute()方法,並將doInBackground()方法的返回值傳給該方法.

    3、調用 AsyncTask 子類的實例 execute(Params ... params)開始執行耗時任務。

  使用AsyncTask 是必須遵守如下規則

    1、必須在UI線程中創建 AsyncTask 的實例

    2、必須在UI線程中調用 AsyncTask 的execute()方法

    3、AsyncTask 的 onPreExecute()、onPostExecute(Result  result)、doInBackground(Params... params),onProgressUpdate(Progress...values)方法,不應該由程式員代碼調用,而是由Android系統負責調用。

    4、每個 AsyncTask 只能被執行一次,多次調用將會引發異常。  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ShineJaie 原創,轉載請註明出處。 昨晚在一個交流群里看到有位網友提了一個他的面試題求助答疑。剛好我也有看到,就對這個問題思考了一下,覺得這道題對理解 JavaScript 作用域還是很有幫助的,特此又把自己的解題思路梳理了一遍,希望對其它人有所幫助。 首先看下麵試題: 1 var arr
  • jQuery 2 的版本與jQuery 1的版本相比,沒有再考慮IE6,7,8的相容問題,因此使用時如果不用考慮IE6,7,8就用jQuery 2的版本,如果需要考慮IE6,7,8就使用jQuery 1的版本。 jQuery對象是一個以DOM為對象的特殊數組,並包含大量方法,簡單可以理解為: fun...
  • 作者: "@gzdaijie" 本文為作者原創,轉載請註明出處:http://www.cnblogs.com/gzdaijie/p/5255084.html 目錄 1.Activity生命周期 1.1 Activity生命周期簡介與測試 1.2 設備旋轉時的生命周期與數據恢復 1.3 Activit
  • EventBus是一個Android上用的消息分發的類庫,非常靈活好用,主要的原理是利用了反射註冊以及調用. 本文是在閱讀EventBus的源碼過程中所記錄的東西, 遇到不懂的去查了,然後留下了鏈接. 有點流水賬,講得也不是很深入,如果有錯請幫忙指正.
  • 當Activity 處於Android 應用中運行時,它的活動狀態由 Android 以 Activity 棧的形式管理。當前活動的Activity位於棧頂。隨著不同應用的運行,每個Activity都有可能從活動狀態轉入非活動狀態,也可能從非活動狀態轉入活動狀態。 Activity 的生命周期 歸納
  • 所謂的單例就是:一個應用程式(app)只有一個實例化對象,這個對象就是單例,一般用於音樂播放器和工具類 在這裡教大家如何手動創建單例,一種是利用互斥鎖的方式,另一種是利用dispatch的一次性執行. 1//通過互斥鎖創建單例 2 +(instancetype)sharedNetWorkTools
  • 概述 我們平時也使用了很多的xcode插件,雖然官方對於插件製作沒有提供任何支持,但是載入三方的插件,預設還是被允許的.第三方的插件,需要存放在 ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins文件夾中,尾碼名必須是.xcpl
  • 用eclipse新建Android工程時,自動生成的appcompat_v7出錯,有個紅色交叉,而且新建的Android工程有一個紅色感嘆號。 這時你去看看你新建的Android工程是不是沒有生成R文件。當你Refresh和Clean都毫無成效後,不妨更新sdk試試。 更新sdk的時候只需要安裝SD
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...