深入Android架構(從線程到AIDL)_12 Android UI 單線程程序

目錄

6、 Android UI 單線程程序

單線程程序概念

單線程可避免線程安全問題

SurfaceView與非UI線程


6、 Android UI 單線程程序

單線程程序概念
  • 單線程程序意謂著兩個(或多個)線程不能共享對象或變量值。
  • Android的UI是單線程程序的環境。
  • UI控件(如Button等)都是由UI線程所創建,內部攸關于UI顯示的屬性或變量都只有UI線程才能存取(Access)之,別的線程并不能去存取之。
  • 例如下圖里的View類別體系,都只限于UI線程才能去執行它們的onDraw()函數,因為它會實際更動到UI的屬性。

  • 由于UI線程來執行onCreate()函數,誕生了Button對象,因而只限UI線程能去存取該對象里攸關UI的屬性,其它線程不能去碰它們。
單線程可避免線程安全問題
  • 線程安全問題就是如何避免不同線程之間,可能會相互干擾的問題。
  • 雖然兩個線程幾乎同時先后執行一個類別里的(可能不同)函數,只要不共享對象、或共享變量(例如Android的UI單線程環境),就不會產生干擾現象,也就沒有線程安全問題。
  • 換句話說,如果各自使用自己的對象或變量(即不共享對象或變量),就不會干擾到別線程執行的正確性了。
  • 例如下述范例:
    // Ex01.java
    class Task2{private int count;public void init(){ count = 0; }public void f1() {for(int i=0; i<3; i++) {count++;try {Thread.sleep(10);} catch (InterruptedException e) { e.printStackTrace(); }System.out.println(Thread.currentThread().getName() +"'s count: " + count);}}
    }class Task implements Runnable {public void run() {Task2 ta2 = new Task2();ta2.init(); ta2.f1();}
    }public class JMain {public static void main(String[] args) {Task ta = new Task();Thread t1 = new Thread( ta, "A");Thread t2 = new Thread( ta, "B");t1.start();t2.start();System.out.println("Waiting...");}
    }

    這里, t1和t2線程共享主線程所誕生的ta對象,但是各自誕生了Task2類別之對象。兩者各自使用自己的對象(即不共享對象或變量),就不會干擾到別線程的數據。所以輸出正確的結果:
    ? ? ? ? ?Waiting...
    ? ? ? ? ? ? B's count: 1
    ? ? ? ? ? ? A's count: 1
    ? ? ? ? ? ?B's count: 2
    ? ? ? ? ? ?A's count: 2
    ? ? ? ? ? ?B's count: 3
    ? ? ? ? ? ?A's count: 3

SurfaceView與非UI線程
  • View控件是由UI 線程(主線程)所執行。如果需要去迅速更新UI畫面或者UI畫圖需要較長時間(避免阻塞主線程),就使用SurfaceView。
  • 它可以由背景線程(background thead)來執行,而View只能由UI(主)線程執行畫面顯示或更新。
  • 在SurfaceView里,非UI線程可以去碰觸UI顯示,例如將圖形繪制于Surface畫布上。這SurfaceView內含高效率的rendering機制,能讓背景線程快速更新surface的內容,適合演示動畫(animation)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/65219.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65219.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65219.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

STM32-筆記36-ADC(模擬/數字轉換器)

一、什么是ADC&#xff1f; 全稱&#xff1a;Analog-to-Digital Converter&#xff0c;指模擬/數字轉換器。 ADC可以將引腳上連續變化的模擬電壓轉換為內存中存儲的數字變量&#xff0c;建立模擬電路到數字電路的橋梁。 12 位 ADC 是一種逐次逼近型模擬數字轉換器&#xff08;0…

房產銷售系統(源碼+數據庫+文檔)

親測完美運行帶論文&#xff1a;文末獲取源碼 文章目錄 項目簡介&#xff08;論文摘要&#xff09;運行視頻包含的文件列表&#xff08;含論文&#xff09;前端運行截圖后端運行截圖 項目簡介&#xff08;論文摘要&#xff09; 隨著科學技術的飛速發展&#xff0c;各行各業都在…

游戲社交趨勢下,游戲語音再升級!

如今&#xff0c;游戲已成為我們社交生活的一個重要娛樂方式&#xff0c;春節臨近&#xff0c;與親朋好友一起暢玩“開黑”無疑是節假日的一大樂趣。在游戲社交互動中&#xff0c;“游戲語音”不可或缺。在傳統游戲語音領域&#xff0c;多人在線游戲如 MOBA、FPS 和 MMORPG 的實…

HTML5實現好看的博客網站、通用大作業網頁模板源碼

HTML5實現好看的博客網站、通用大作業網頁模板源碼 前言一、設計來源1.1 主界面1.2 列表界面1.3 文章界面 二、效果和源碼2.1 動態效果2.2 源代碼 源碼下載結束語 HTML5實現好看的博客網站、通用大作業網頁模板源碼&#xff0c;博客網站源碼&#xff0c;HTML模板源碼&#xff0…

ArcGIS中怎么把數據提取到指定范圍(裁剪、掩膜提取)

最近&#xff0c;經常能收到怎么把數據提取到指定范圍、柵格數據怎么裁剪、矢量數據怎么裁剪、柵格數據怎么掩膜提取的咨詢。 下面是我對這個問題的解決思路&#xff1a; 對于矢量數據&#xff1a; ①首先把數據加載進來 ②軟件界面上面的工具欄找到→地理處理→裁剪&#x…

PHP 使用集合 處理復雜數據 提升開發效率

文章精選推薦 1 JetBrains Ai assistant 編程工具讓你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的圖標增強神器 3 IDEA插件推薦-SequenceDiagram&#xff0c;自動生成時序圖 4 BashSupport Pro 這個ides插件主要是用來干嘛的 &#xff1f; 5 IDEA必裝的插件&…

(轉)rabbitmq怎么保證消息不丟失?

RabbitMQ 可以通過以下多種機制來保證消息不丟失&#xff1a; 生產階段 - 持久化隊列和交換器&#xff1a; - 在聲明隊列和交換器時&#xff0c;將 durable 參數設置為 true &#xff0c;確保它們是持久化的。這樣&#xff0c;即使 RabbitMQ 節點重新啟動&#xff0c;隊列和交…

node.js內置模塊之---stream 模塊

stream 模塊的作用 在 Node.js 中&#xff0c;stream 模塊是一個用于處理流&#xff08;stream&#xff09;的核心模塊。流是一種處理數據的抽象方式&#xff0c;允許程序處理大量數據時不會一次性將所有數據加載到內存中&#xff0c;從而提高性能和內存效率。通過流&#xff0…

手持PDA終端,提升零售門店管理效率

隨著科技的不斷進步和零售行業的持續發展&#xff0c;手持PDA終端的應用將會越來越廣泛。它將不斷融合更多先進的技術和功能&#xff0c;為零售門店管理帶來更加便捷、高效、智能的解決方案。 手持PDA終端是集成了數據處理、條碼掃描、無線通信等多種功能于一體的便攜式設備?…

LeetCode -Hot100 - 53. 最大子數組和

前言 本專欄主要通過“LeetCode 熱題100”&#xff0c;來撿起自己本科階段的算法知識與技巧。語言主要使用c/java。如果同樣正在練習LeetCode 熱題100的朋友歡迎關注或訂閱本專欄。有疑問歡迎留言交流~ 題目描述 題目鏈接 示例 1&#xff1a; 輸入&#xff1a;nums [-2,1…

【51單片機-零基礎chapter1】

安裝軟件(配套的有,不多贅述) 1.管理員身份運行keil和破解軟件kegen 將CID代碼復制粘貼到 一定要管理員方式,不然會error 插入板子 我的電腦,管理 1.如果是拯救者,查看端口,如果沒有則顯示隱藏 2.蘋果不知道,好像不可以 3.其他電腦在"其他設備找" (注:本人在校已…

Go語言的 的設計模式(Design Patterns)基礎知識

Go語言的設計模式基礎知識 引言 設計模式是一種在軟件開發中經常使用的解決特定問題的通用方案。它們為開發者提供了一種有效的方式來組織代碼、提高代碼的可復用性、可維護性和靈活性。在眾多編程語言中&#xff0c;Go語言因其獨特的特性&#xff0c;如并發支持和簡潔的語法…

使用JMeter玩轉tidb壓測

作者&#xff1a; du拉松 原文來源&#xff1a; https://tidb.net/blog/3f1ada39 一、前言 tidb是mysql協議的&#xff0c;所以在使用過程中使用tidb的相關工具連接即可。因為jmeter是java開發的相關工具&#xff0c;直接使用mysql的jdbc驅動包即可。 二、linux下安裝jmet…

C# 設計模式(結構型模式):外觀模式

C# 設計模式&#xff08;結構型模式&#xff09;&#xff1a;外觀模式 (Facade Pattern) 在復雜系統中&#xff0c;往往會涉及到多個子系統、模塊和類。這些子系統的接口和功能可能會讓使用者感到困惑和復雜。在這種情況下&#xff0c;我們可以使用外觀模式&#xff08;Facade…

計算機網絡常見面試題及解答

以下是計算機網絡中常見的面試題及解答&#xff0c;按主題分類&#xff1a; --- ## **一、基礎概念** ### **1. OSI 七層模型和 TCP/IP 模型的區別是什么&#xff1f;** **答&#xff1a;** - **OSI 七層模型&#xff1a;** - 應用層、表示層、會話層、傳輸層、網絡層、數…

Win11+WLS Ubuntu 鴻蒙開發環境搭建(一)

參考文章 Windows11安裝linux子系統 WSL子系統遷移、備份與導入全攻略 如何擴展 WSL 2 虛擬硬盤的大小 Win10安裝的WSL子系統占用磁盤空間過大如何釋放 《Ubuntu — 調整文件系統大小命令resize2fs》 penHarmony南向開發筆記&#xff08;一&#xff09;開發環境搭建 一&a…

微信小程序提示 miniprogram-recycle-view 引入失敗

npm i --save miniprogram-recycle-view 安裝需要使用的頁面的json文件中配置 {"usingComponents": {"recycle-view": "miniprogram-recycle-view/recycle-view","recycle-item": "miniprogram-recycle-view/recycle-item"…

基于深度學習算法的AI圖像視覺檢測

基于人工智能和深度學習方法的現代計算機視覺技術在過去10年里取得了顯著進展。如今&#xff0c;它被廣泛用于圖像分類、人臉識別、圖像中物體的識別等。那么什么是深度學習&#xff1f;深度學習是如何應用在視覺檢測上的呢&#xff1f; 什么是深度學習&#xff1f; 深度學習是…

Go語言的 的基本數據類型(Primitive Data Types)核心知識

Go語言的基本數據類型&#xff08;Primitive Data Types&#xff09;核心知識 Go語言&#xff08;又稱Golang&#xff09;是一種開源編程語言&#xff0c;由Google設計并開發。它以高效、簡潔和強大的并發支持著稱。Go語言支持多種數據類型&#xff0c;其中基本數據類型是構建…

ElasticSearch基礎-文章目錄

ElasticSearch學習總結1&#xff08;環境安裝&#xff09; ElasticSearch學習總結2&#xff08;基礎查詢&#xff09; ElasticSearch學習總結3&#xff08;.NetCore操作ES&#xff09; ElasticSearch學習總結4&#xff08;sql操作ES&#xff09; ElasticSearch學習總結5&am…