2013-04-10 96 views
2

基於點擊按鈕,我必須做一些處理,需要一些時間。所以我決定在主UI線程的一個單獨線程中執行此操作。將更新/數據從一個線程發送到Android中的UI線程

現在,基於單獨線程中的計算,我在創建此新線程的UI線程主類中調用一個函數。在這個功能中,我更新了UI。我被告知這不會工作,因爲我需要調用主UI線程。

有人可以幫助我嗎?

@Override 
public void onListItemClicked(int index, Map<String, Object> data) { 

    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      // Issue command() on a separate thread 
      wasCommandSuccess(command()); 
     } 
    }).start(); 
} 


private void wasCommandSuccess(boolean result){ 
    if (result == false){ 
     getUI(BasicUI.class).showAlert("Command failed!", "Unable to access"); 
    } 
} 
+0

你通常會使用AsyncTask來做到這一點。不過,我敢打賭,在網絡上進行簡單的搜索會告訴你。請參閱http://stackoverflow.com/q/4369537/1856738 – 2013-04-10 09:21:55

+0

我的課程已經擴展了另一個課程 – Sunny 2013-04-10 09:26:26

+0

是的,那又如何?你必須實現你的線程,所以你可以實現一個AsyncTask,不是嗎? – 2013-04-10 09:28:02

回答

1

您應該在runOnUiThread()中調用函數wasCommandSuccess;所以你應該有這樣的代碼:

@Override 
public void onListItemClicked(int index, Map<String, Object> data) { 

    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      // Issue command() on a separate thread 
      final boolean result = command(); 
      // you need to pass your context (any of Activity/Service/Application) here before this 
      context.runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        wasCommandSuccess(result); 
       } 
      }); 
     } 
    }).start(); 
} 


private void wasCommandSuccess(boolean result){ 
    if (result == false){ 
     getUI(BasicUI.class).showAlert("Command failed!", "Unable to access"); 
    } 
} 
+0

謝謝,但它說runOnUIThread()未定義 – Sunny 2013-04-10 09:35:52

+0

此代碼片段只有在它是實現偵聽器的Activity的一部分時纔有效;這是目前沒有證據可以被看到的假設。由@Sunny提供的代碼片段可以位於任何地方。 – 2013-04-10 09:35:53

+0

@孫尼赫赫我知道了。氪的假設是無效的。 – 2013-04-10 09:36:27