当我发现像 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/