android - 更新 UI/runOnUiThread/final 变量 : How to write lean code that does UI updating when called from another Thread

标签 android user-interface final

当我发现像 WinForms 一样,Android 需要从主线程进行 UI 更新时,我一直在阅读 UI 更新(太糟糕了,我希望有人能够一劳永逸地解决这个恼人的问题) .

无论如何,我需要将其传递给 UI 线程。有些人建议使用 runOnUiThread 方法,如果不是随后出现的令人恼火的“最终”方法,这可能会起作用。

我有一个接口(interface),其方法我无法更改。它看起来像这样:

@Override
public void connStateChange(ClientHandler clientHandler)

当我的连接状态(网络)发生变化时,会调用该方法。当我这样做时,我需要做一些事情,在本例中,它是向 TextView 添加一些文本。

所以我尝试了这个,但当然变量“clientHandler”不是最终的:

@Override
public void connStateChange(ClientHandler clientHandler) {

   runOnUiThread(new Runnable()
   {
      public void run()
      {
        tv.append(clientHandler.getIP() + ", " + clientHandler.state.toString() + "\n");
        if (clientHandler.state == State.Connected)
        {
            tv.append("Loginserver hittad");
        }
      }
   });
}

在此示例中,我如何以一种良好、干净且高效的方式编写代码来更新 UI?我需要访问我的所有变量等...

最佳答案

尝试一下:

@Override 
public void connStateChange(ClientHandler clientHandler) {
    final ClientHandler temporaryHander = clientHandler;
    runOnUiThread(new Runnable() {
         public void run() {
               tv.append(temporaryHandler.getIP() + ", " + temporaryHandler.state.toString() + "\n"); 
               if (temporaryHandler.state == State.Connected) {
                    tv.append("Loginserver hittad");         
               }       
         }    
    }); 
} 

顺便说一句,如果您不在方法中声明匿名类,而是在方法外声明内部类,则代码会变得更具可读性。将其视为模式命令。

更干净且可重用的代码示例。

@Override 
public void connStateChange(ClientHandler clientHandler) {
    final ClientHandler temporaryHander = clientHandler;
    runOnUiThread(new MyRunnableCommand(temporaryHandler)); 
} 

private class MyRunnableCommand implements Runnable { 

     private ClientHandler clientHandler;

     public MyRunnableCommand(ClientHandler clientHandler) {
         this.clientHandler = clientHandler;
     }

     @Override
     public void run() {
               tv.append(clientHandler.getIP() + ", " + clientHandler.state.toString() + "\n"); 
               if (clientHandler.state == State.Connected) {
                    tv.append("Loginserver hittad");         
               }       
         } 

}

虽然 Runnable 实现本身有点膨胀,但代码变得更加可重用且易于阅读。

关于android - 更新 UI/runOnUiThread/final 变量 : How to write lean code that does UI updating when called from another Thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7619942/

相关文章:

QT GUI -> 单个窗口中的多个 View

javascript - 当用户在文本框中键入指定字符时显示建议

Java 和 Final 关键字的使用

java - JVM 对 `final` 的处理

java - 在同一个 Scala 类上定义的抽象类和最终类

android - 如何在 Mac 上调试 SIGSEGV?

c++ - 如何有效地渲染双缓冲窗口而没有任何撕裂效果?

Java 未知主机异常

android - 如何创建自定义抽屉导航?

java - java中的热敏打印机命令