2013-04-10 83 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