android為什麼不允許在子執行緒中訪問UI
首先,UI控制元件不是執行緒安全的,如果多執行緒併發訪問UI控制元件可能會出現不可預期的狀態
那為什麼系統不對UI控制元件的訪問加上鎖機制呢?
缺點有兩個:
- 加上鎖機制會讓UI訪問的邏輯變得複雜;
- 鎖機制會降低UI訪問的效率,因為鎖機制會阻塞某些執行緒的執行
鑑於這兩個缺點,最簡單且高效的方法就是採用單執行緒模型來處理UI操作,所以原始碼ViewRootImpl中會有對執行緒的一個判斷,程式碼如下:
frameworks/base/core/java/android/view/ViewRootImpl.java
void checkThread() { if (mThread != Thread.currentThread()) { throw new CalledFromWrongThreadException( "Only the original thread that created a view hierarchy can touch its views."); } }
對於開發者來說也不是很麻煩,只是通過handler切換一下UI訪問的執行執行緒即可
相關推薦
android為什麼不允許在子執行緒中訪問UI
首先,UI控制元件不是執行緒安全的,如果多執行緒併發訪問UI控制元件可能會出現不可預期的狀態 那為什麼系統不對UI控制元件的訪問加上鎖機制呢? 缺點有兩個: 加上鎖機制會讓UI訪問的邏輯變得複雜; 鎖機制會降低UI訪問的效率,因為鎖機制會阻塞某些執行緒的執行
android-如何在子執行緒中更新ui
正如我們知道的,android是不讓在子執行緒中更新ui的。在子執行緒中更新ui會直接丟擲異常 Only the original thread that created a view hierarchy can touch its views 那麼這種檢查
Android執行緒模型--在子執行緒中更新UI
Android是支援多執行緒的。主執行緒也稱UI執行緒,子執行緒也稱工作執行緒。一般耗時操作在子執行緒中進行,更新UI操作在主執行緒中進行。在主執行緒中執行耗時操作容易發生ANR錯誤,即應用程式無響應。而Android中又規定只有建立UI的執行緒
Android子執行緒中更新UI的3種方法
//UI執行緒中執行 new DownloadImageTask().execute( "www.91dota.com" ); private class DownloadImageTask extends AsyncTask { protected String doInBackgrou
android 在子執行緒中操作UI 導致Fragment顯示空白問題
需求是這樣的 當沒網路的請求下就顯示快取中的資料,這樣做是為了在沒網的情況下 不至於介面什麼都沒有,給使用者的體驗效果不好,所以就加了個快取機制,但是這個快取的程式碼是我從上家公司拷貝過來的,沒怎麼仔
Android多執行緒之(一)View.post()原始碼分析——在子執行緒中更新UI
提起View.post(),相信不少童鞋一點都不陌生,它用得最多的有兩個功能,使用簡便而且實用: 1)在子執行緒中更新UI。從子執行緒中切換到主執行緒更新UI,不需要額外new一個Handler例項來實
在子執行緒中更新UI
和許多其他的GUI庫一樣,Android的UI也是執行緒不安全的。也就是說,如果想要更新應用程式裡的UI元素,則必須在主執行緒中進行,否則就會出現異常。 一、新建一個AndroidThreadTest專案,然後修改activity_main.
Looper.prepare()和Looper.loop(),在子執行緒中更新UI
當子執行緒想直接更新UI時,例如進行Toast提示。 可以先Looper.prepare(),然後Looper.loop(),程式碼如下(加黑處): public class CrashHandler implements UncaughtExceptionHandler
安卓學習筆記(一)——執行緒的用法及怎樣在子執行緒中更新UI
建立執行緒方法: 1、新建一個繼承自Thread的類MyThread,然後重寫父類的run()方法,在裡面寫要執行的內容; class MyThread extends Thread { @Ove
使用Handler在子執行緒中更新UI
我們知道,使用者的耐性是有極限的。一般來說,一個請求如果2到5秒鐘沒有響應,使用者就會想砸機器。為了優化使用者的互動設計,就不能阻塞UI執行緒,也就是不能在UI執行緒中執行耗時的操作,比如說網路請求。但是這種耗時操作是不可避免的,所以耗時操作只能放到子執行緒中。一個耗時操作
Android面試:主執行緒中的Looper.loop()一直無限迴圈為什麼不會造成ANR?(轉)
引子: 正如我們所知,在android中如果主執行緒中進行耗時操作會引發ANR(Application Not Responding)異常。 造成ANR的原因一般有兩種: 只有當應用程式的UI執行緒響應超時才會引起ANR,超時產生原因一般有兩種 1. 當前的事件沒有機會
Android主執行緒向子執行緒中傳送資訊
主要用到了Handler類,Looper類和Message類 先介紹下這幾個類 Looper類,是用來為一個執行緒開啟一個訊息佇列,預設情況下Android下新開啟的執行緒沒有開啟訊息佇列的,除了主執行緒外,主執行緒系統會預設為其開啟一個訊息佇列;looper是通過MessageQueu
[轉]Android限制只能在主執行緒中進行UI訪問的實現原理
目錄 Android限制只能在主執行緒中進行UI訪問 Thread的實現 Android Thread 的構造方法 Android Thread 的start()方法 如何在我們自己的程式碼中去檢測當前Thread是不是UI執
(轉載)Android中Handler的使用方法——在子執行緒中更新介面
本文主要介紹Android的Handler的使用方法。Handler可以傳送Messsage和Runnable物件到與其相關聯的執行緒的訊息佇列。每個Handler物件與建立它的執行緒相關聯,並且每個Handler物件只能與一個執行緒相關聯。 Handler一般有兩種
Android--Handler的使用方法:在子執行緒中更新介面
本文主要介紹Android的Handler的使用方法。Handler可以傳送Messsage和Runnable物件到與其相關聯的執行緒的訊息佇列。每個Handler物件與建立它的執行緒相關聯,並且每個Handler物件只能與一個執行緒相關聯。 Handler一般有
Android可以在子執行緒更新(重新整理)UI---"假象"
有時候,我們線上程裡面需要彈框,然而在用Toast彈框後,會出一個Can't create handler inside thread that has not called Looper.prepare() 錯誤。。。。原因很簡單就是因為安卓介面更新的操作需要在主執行緒操作. 實現
在子執行緒中new Handler報錯--Can't create handler inside thread that has not called Looper.prepare()
在子執行緒中new一個Handler為什麼會報以下錯誤? java.lang.RuntimeException: Can't create handler inside thread that has not&
子執行緒中呼叫UpdateData(TRUE/FALSE)出現異常解決方法
使用子執行緒去呼叫UpdateData(TRUE/FALSE)方法更新窗體控制元件值時,總是會彈出“Debug Assertion Failed”異常錯誤; 原因是:工作執行緒(子執行
在子執行緒中進行二次取樣
個人整理思路: 1.獲取相簿中圖片,得到圖片的路徑 2.獲取儲存圖片設定的邊框的寬高, 與原有寬高計算出縮放比例----第一次取樣只讀取圖片,不載入到記憶體 3.將
python在子執行緒中使用WMI報錯-2147221020-moniker,i,bindCTX=pythoncom.MKParseDisplayName(Pathname) ——轉載
判斷電腦是否存在某程序: #check_exsit def check_exsit(process_name): #線上程中使用需要加初始化和去初始化方法 pythoncom.CoInitialize() &nbs