1. 程式人生 > >android後臺執行緒更新UI

android後臺執行緒更新UI

Android中後臺執行緒是無法直接更新UI程式的,這和Qt是一樣的;

如果想要線上程中更新UI,一般有一下幾個方法:

方法一:

在主執行緒中,繼承重新Handler類,重寫handleMessage函式,接受通過myHandler物件傳送的訊息;

Handler myHandler = new Handler() {  
          public void handleMessage(Message msg) {   
               switch (msg.what) {   
                    case 1:   
                         UpdateUIFunction();  
                         break
; } super.handleMessage(msg); } };

或者

通過java回撥的方法構造Handler,獲取訊息;實質和上面的方法一樣;

方法二:

通過 Handler的post(Runnable r)函式,直接主執行緒中呼叫UI函式:

這個方法應用起來更簡單一些;

Handler m_handlerThread = new Handler();  //注意:Handler的示例宣告還是要放到接收訊息的類中實現; 一般就是主執行緒(UI執行緒);


public class 
thread_count extends Thread { int nCount = 0; @Override public void run() { while (true) { m_handlerThread.post(new Runnable() { @Override public void run() { textView.setText("thread UI: " + nCount++ ); } } ); try
{ sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } } @Override public void onClick(View v) { new thread_count().start(); } 方法二.1; 如果想在工作執行緒中建立UI執行緒(主執行緒的Handler)那麼需要:引數: Looper.getMainLooper())
Handler handler = new Handler(Looper.getMainLooper());

一般情況,new Handler不帶引數的是獲取當前執行緒的Looper; 更多資訊可以百度;


 handler.post(new Runnable() {
    @Override
public void run() {
        textview.show();
    }
});




方法三:更加簡單一些:

主要通過View的post函式; 具體和Handler的post區別可以查詢;

new Thread()
{
    @Override
public void run()
    {
        try
{
            sleep(1000*10);
        } catch (InterruptedException e)
        {
            e.printStackTrace();
        }



        mBluetoothAdapter.stopLeScan( LeScanCallback_fun );

        textview.post(new Runnable()
        {
            @Override
public void run()
            {
                textview.setText( "直接更新UI控制元件" );
            }
        });


    }
}.start();

相關推薦

android後臺執行更新UI

Android中後臺執行緒是無法直接更新UI程式的,這和Qt是一樣的; 如果想要線上程中更新UI,一般有一下幾個方法: 方法一: 在主執行緒中,繼承重新Handler類,重寫handleMessage函式,接受通過myHandler物件傳送的訊息; Handler my

Android執行更新UI【通過RunOnUI】

在Fragment中無法直接使用runonuithread   runOnUiThread這個方法只存在於Activity中,想用它必須獲取Activity的例項。   MainActiivty.this.runOnUiThread(),就沒問

Android執行更新UI 異常

眾所周知,Android是不可以在子執行緒中直接更新UI的,需要藉助Handler或者View.post(Runnable runnable)或者runOnUIThread(Runnable runnable)將更新的程式碼切入到主執行緒中去實現UI更新。 我們來試一下,在Activity的 onCreat

Android複習之旅--子執行更新UI

Android4.0版本後耗時的操作(比如請求網路,下載檔案等)不能在UI主執行緒執行,而且子執行緒也不能直接更新UI介面。而現實的場景確是子執行緒在下載檔案的同時UI介面能顯示相應的進度資訊,既然有了需求,那肯定就會有解決方案。 Android提供了Handler訊息機制和Asyn

Android中使用非同步執行更新UI檢視的幾種方法

在Android中子執行緒是不能更新ui的。 所以我們要通過其他方式來動態改變ui檢視, 1、runOnUiThreadactivity提供的一個輕量級更新ui的方法,在Fragment需要使用的時候要用getActivity.runOnUiThread開啟執行緒 這種方法最簡單,方便更新一些不需要判斷的

為什麼Android必須在主執行更新UI

為什麼Android必須在主執行緒更新UI? 站在各位大牛的肩膀上,謝謝! 正常情況下,Android需要在UI執行緒更新UI,然鵝,在特殊情況下,子執行緒也能更新UI不在討論之列,可參考Android中子執行緒真的不能更新UI嗎?這篇文章主要講一下個人理解的正常情況下為什麼不能在非

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

WPF 執行更新UI介面

線上程中無法直接操作UI元素,可以通過執行緒的Dispatch.Invoke方法來更新UI介面。 XAML介面 <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

python3多執行更新UI資料,pyqt5介面重新整理

本程式碼執行python3,pyqt5環境下。在編寫介面程式的時候經常會執行一些耗時的操作,所以我們要使用多執行緒來做耗時任務,主執行緒用來重繪介面。而子執行緒裡邊的實時處理結果需要反饋到介面。而總所

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)             {      

SWT中非UI執行更新UI的方法

有時用swt會需要在費時的操作後更新ui,如果直接在回撥函式裡更新,介面會卡死,另起一個執行緒更新,會出現異常。這時就可以用Display類中的asyncExec或者syncExec方法。 pub

安卓4.0以後主執行訪問網路問題(NetworkOnMainThreadException)解決方法及子執行更新ui

安卓4.0之後谷歌建議不在主執行緒訪問網路,可能是因為訪問網路可能會等待時間長造成假死現象,解決辦法無非是強行訪問和開一個子執行緒訪問 1.強行訪問: 在activity裡面onCreate方法裡面加

【iOS沉思錄】iOS子執行更新UI到主執行的三種方法

簡單說將程式碼同步到主執行緒執行的三種方法如下: // 1.NSThread [self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO];

執行更新UI (執行與委託)

執行緒更新UI1.委託主執行緒:this.Invoke((EventHandler)(delegate        {UI更新}));if (this.richTextBox_message.InvokeRequired){    this.Invoke((EventHan

wxpython後臺執行更新介面控制元件方法

在大多數的GUI應用程式中,在應用程式的後臺中長期執行一個處理過程而不干涉使用者與應用程式的其它部分的互動是有好處的。允許後臺處理的機制通常是產生一個執行緒並在該執行緒中長期執行一個處理過程。對於wxPython的多執行緒有兩點需要特別說明。 最重要的一點是,GUI的

iOS 主執行更新UI

方法1:performSelectorOnMainThread [self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:NO]; 方法2:dispa