在Android应用中,我正在使用NFC阅读器。应用中有一个用于该NFC阅读器的监听器。读取NFC标签后,它将触发应用程序中的侦听器。该侦听器不在主线程中,而是在工作线程中。
调用该事件时,我需要使用该值更新UI。 由于这是一个工作线程,因此我的代码如下:
runOnUiThread(new Runnable() {
@Override
public void run() {
binding.nfc.setVisibility(View.VISIBLE);
binding.nfcProgressBar.setVisibility(View.VISIBLE);
}
});
其中绑定是将UI组件绑定到视图模型中的数据。
问题在于UI组件的更新,即使run()中的那行代码始终被执行。有时它会更新,有时却不会。
在同一活动中将连续读取NFC,这是我在打开应用程序后第一次阅读NFC时,它会起作用,然后波动。
每次都会通过runOnUiThread Runnable方法,但是UI有时只会更新。
我想知道我的代码是否有问题,或者runOnUiThread只是这样。
它在波动。
答案 0 :(得分:1)
您的问题与数据绑定无关,它只是使用数据绑定框架包装器来保存您的findViewById,而您仍在手动进行其他操作。对您来说,这是一种美化的ViewHolder模式。
如果正确使用数据绑定和可观察变量,则不必关心线程。 Android将为您处理。当您更新可观察值时,它将自动确保使用正确的ui线程来更新ui。
但是,您没有这样做。您正在手动使用binding.uielement.property = newValue 那没什么不同 findViewById(someView).property = newValue 事实就是它已经为您完成了findview。
这不是要使用绑定的方式。您也可以返回到findById的标准编码,然后将其设置为完全没有从绑定中受益。
如果您希望通过绑定进行管理。您应该创建一个可观察的类,并将其传递给onCreate,以允许它通过更新UI的属性为您管理绑定和更新。
现在,如果您删除与绑定有关的部分,而只是问您的runOnUIThread问题是什么,那就不一样了。必须要查看所涉及的完整类,以及您要影响的版式和嵌套版式的xml,然后我们才能开始深入研究。