Android 子執行緒更新UI 異常
眾所周知,Android是不可以在子執行緒中直接更新UI的,需要藉助Handler或者View.post(Runnable runnable)或者runOnUIThread(Runnable runnable)將更新的程式碼切入到主執行緒中去實現UI更新。
我們來試一下,在Activity的 onCreate中直接在新執行緒中去更新一個TextView的文字,結果發現,WHAT?竟然沒有丟擲異常,更新也成功了?
這是因為在onCreate中尚未完成View的繪製,此時TextView中有個變數mLayout仍為null,setText時不執行重繪,沒有執行到丟擲執行緒異常的程式碼,但是相應的text卻變化了。在Activity分發子View的Layout後,繪製的時變化後的text,故不丟擲異常。其他View如ImageView也有類似現象出現。
如果在textview.getViewTreeObserver().addOnGlobalLayoutListener(OnGlobalLayoutListener listener)中新增監聽繪製完畢的事件,然後再在子執行緒中更新UI,則會丟擲異常。
歸根結底,不能鑽這個空子,不優美、不安全!
相關推薦
Android 子執行緒更新UI 異常
眾所周知,Android是不可以在子執行緒中直接更新UI的,需要藉助Handler或者View.post(Runnable runnable)或者runOnUIThread(Runnable runnable)將更新的程式碼切入到主執行緒中去實現UI更新。 我們來試一下,在Activity的 onCreat
Android 子執行緒更新UI【通過RunOnUI】
在Fragment中無法直接使用runonuithread runOnUiThread這個方法只存在於Activity中,想用它必須獲取Activity的例項。 MainActiivty.this.runOnUiThread(),就沒問
Android複習之旅--子執行緒更新UI
Android4.0版本後耗時的操作(比如請求網路,下載檔案等)不能在UI主執行緒執行,而且子執行緒也不能直接更新UI介面。而現實的場景確是子執行緒在下載檔案的同時UI介面能顯示相應的進度資訊,既然有了需求,那肯定就會有解決方案。 Android提供了Handler訊息機制和Asyn
Android在子執行緒更新UI方式總結
1.Handler方式 —————-複寫handler的handleMessage方式——————- //在UI執行緒中建立Handler物件 private Handler mHandler = new Handler(){ @Overrid
Android開發——實現子執行緒更新UI
Android中執行緒按功能分的話,可以分為兩個,一個是主執行緒(UI執行緒),其他的都是子執行緒 主執行緒不能執行那些耗時過長的程式碼或任務(執行耗時過長的程式碼會出現應用未響應的提示),所以都是使用子執行緒來執行耗時過長的程式碼,比如說下載檔案等任務 一般情況,子執行緒中執行過長的程式碼,都是需要進行更新
子執行緒更新ui相關
1.Android載入view有兩種方式:一是setContentView,二是inflater.inflate() 2.子執行緒其實是可以更新ui的,需要viewRoot,ViewRoot本質是一個Handler,作用是建立View與WindowsManger的通訊。通過Windowmanag
Android 子線程更新UI 異常
handle activit 實現 文本 don 重繪 run 不可 ui更新 眾所周知,Android是不可以在子線程中直接更新UI的,需要借助Handler或者View.post(Runnable runnable)或者runOnUIThread(Runnable ru
Python+PyQT5的子執行緒更新UI介面
子執行緒裡是不能更新UI介面的,在移動端方面。Android的UI訪問是沒有加鎖的,多個執行緒可以同時訪問更新操作同一個UI控制元件。也就是說訪問UI的時候,android系統當中的控制元件都不是執行緒安全的,這將導致在多執行緒模式下,當多個執行緒共同訪問更新操作同一個UI控制元件時容易發生不可
Qt子執行緒更新UI的方法
最近剛剛接觸一個qt專案,由於原始程式中的listwidget裡有大量的item,每一個item都有一個按鈕,這樣導致程式執行起來後,生成按鈕的速度很慢,嚴重影響了軟體的使用體驗。於是將生成按鈕的操作放到子執行緒中。一開始我是直接在子執行緒中生成按鈕來更新UI的,
C# WINFORM 子執行緒更新UI
獲取當前執行緒 System.Threading.Thread.CurrentThread.ManagedThreadId //判斷是否建立控制代碼 if (this.IsHandleCreated) {
android後臺執行緒更新UI
Android中後臺執行緒是無法直接更新UI程式的,這和Qt是一樣的; 如果想要線上程中更新UI,一般有一下幾個方法: 方法一: 在主執行緒中,繼承重新Handler類,重寫handleMessage函式,接受通過myHandler物件傳送的訊息; Handler my
安卓4.0以後主執行緒訪問網路問題(NetworkOnMainThreadException)解決方法及子執行緒更新ui
安卓4.0之後谷歌建議不在主執行緒訪問網路,可能是因為訪問網路可能會等待時間長造成假死現象,解決辦法無非是強行訪問和開一個子執行緒訪問 1.強行訪問: 在activity裡面onCreate方法裡面加
【iOS沉思錄】iOS子執行緒更新UI到主執行緒的三種方法
簡單說將程式碼同步到主執行緒執行的三種方法如下: // 1.NSThread [self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO];
[轉]C#子執行緒更新UI控制元件的方法例項總結
[我的評論:之前專案做的C#客戶端對於多執行緒修改UI使用的就是這個,找了好些時間才找到,其他很多都是沒有再函式中直接使用Action<>放置delegate的,而是在全域性下先放一個delegate的宣告,很頭疼,特轉] [來源:http://www.jb51
WPF自學筆記(四):子執行緒更新UI(Dispatcher.BeginInvoke)
在做WPF開發時,如果直接在子執行緒裡更新UI會報錯—–“呼叫執行緒無法訪問此物件,因為另一個執行緒擁有該物件。”,這是因為WPF禁止在非UI執行緒裡直接更新UI介面。 解決方案:
Android可以在子執行緒更新(重新整理)UI---"假象"
有時候,我們線上程裡面需要彈框,然而在用Toast彈框後,會出一個Can't create handler inside thread that has not called Looper.prepare() 錯誤。。。。原因很簡單就是因為安卓介面更新的操作需要在主執行緒操作. 實現
Android 子執行緒UI更新操作之二------AsyncTask
為了更方便的對子執行緒的中的UI進行操作,android提供了一些好用的工具,比如AsyncTask。藉助這個就可以簡單的從子執行緒切換到主執行緒。 當然這個工具也是基於非同步訊息處理機制的,只是安卓做了很好的封裝。 首先要說明的是AsyncTask是一個抽線類,要使用它
Android可以在子執行緒更新(重新整理)UI---"假象"
有時候,我們線上程裡面需要彈框,然而在用Toast彈框後,會出一個Can't create handler inside thread that has not called Looper.prepare() 錯誤。。。。原因很簡單就是因為安卓介面更新的操作需要在主執行緒操
Android子執行緒中更新UI的3種方法
//UI執行緒中執行 new DownloadImageTask().execute( "www.91dota.com" ); private class DownloadImageTask extends AsyncTask { protected String doInBackgrou
Android子執行緒真的不能更新UI嗎?讓我們從原始碼的角度一探究竟
關於主執行緒更新UI這已經是個老生常談的話題,幾乎所有人都知道Android要在主執行緒更新UI。 Android官方文件這樣描述:Android UI操作並不是執行緒安全的,並且這些操作必須在UI執行緒執行。 那麼,子執行緒到底能否更新UI,如果不能更新U