android异步线程利用Handler将消息发送至UI线程
android UI線程安全
首先對于android而言,UI線程就是我們的主線程,在Android應用啟動時,會自動創建一個線程,主線程負責UI的展示、UI事件消息的派發處理等等,因此主線程也叫做UI線程。
- 線程安全的定義
線程安全是多線程編程時的計算機程序代碼中的一個概念。在擁有共享數據的多條線程并行執行的程序中,線程安全的代碼會通過同步機制保證各個線程都可以正常且正確的執行,不會出現數據污染等意外情況。
如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變量的值也和預期的是一樣的,就是線程安全的,或者說:一個類或者程序所提供的接口對于線程來說是原子操作或者多個線程之間的切換不會導致該接口的執行結果存在二義性,也就是說我們不用考慮同步的問題 。
- 為什么說Android UI不是線程安全的?
UI線程才能與Android UI工具包中的組件進行交互,在開發Android應用時必須遵守單線程模型的原則:
android UI 中提供invalidate()來更新界面,而invalidate()方法是線程不安全。
Android提供了Invalidate方法實現界面刷新,但是Invalidate不能直接在非UI主線程中調用,因為他是違背了單線程模型:Android UI操作并不是線程安全的,并且這些操作必須在UI線程中調用。例如:在非UI線程中調用invalidate會導致線程不安全,也就是說可能在非UI線程中刷新界面的時候,UI線程(或者其他非UI線程)也在刷新界面,這樣就導致多個界面刷新的操作不能同步,導致線程不安全。
Handler類
Handler主要用于異步消息的處理:當發出一個消息之后,首先進入一個消息隊列,發送消息的函數即刻返回,而另外一個部分在消息隊列中逐一將消息取出,然后對消息進行處理,也就是發送消息和接收消息不是同步的處理。 這種機制通常用來處理相對耗時比較長的操作。
傳遞Message。用于接受子線程發送的數據, 并用此數據配合主線程更新UI。
在Android中,對于UI的操作通常需要放在主線程中進行操作。如果在子線程中有關于UI的操作,那么就需要把數據消息作為一個Message對象發送到消息隊列中,然后,由Handler中的handlerMessage方法處理傳過來的數據信息,并操作UI。當然,Handler對象是在主線程中初始化的,因為它需要綁定在主線程的消息隊列中。
類sendMessage(Message msg)方法實現發送消息的操作。 在初始化Handler對象時重寫的handleMessage方法來接收Message并進行相關操作。
- Message
Message是Handler接收與處理的消息對象
其中msg.what主要用于區分handler接受到的message實例。根據此區分,Handler可以對消息進行不同的處理操作。
msg.setData(),可以將數據存入msg。
利用handler.sendMessage(msg);將消息發送給Handler
通過Handler類將子線程中更新UI的消息發送至UI線程更新UI
- 子線程中
因為在Android段進行異步網絡請求獲取數據的時候,成功獲取得到數據是在子線程中的,因為UI更新是需要在UI線程(主線程)中進行的。所以需要發送一個Message給Handler,在主線程中接收消息并處理。
- 主線程中
主線程接收并處理子線程中發送的Message
參考資料
- 定義部分摘自:https://www.jianshu.com/p/8e65b2d66162
總結
以上是生活随笔為你收集整理的android异步线程利用Handler将消息发送至UI线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Boot项目无法找到get
- 下一篇: 强网杯2020-dice2crybaby