Android runOnUiThread()线程在波动

时间:2018-08-07 14:50:15

标签: java android multithreading android-runonuithread

在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只是这样。

它在波动。

1 个答案:

答案 0 :(得分:1)

您的问题与数据绑定无关,它只是使用数据绑定框架包装器来保存您的findViewById,而您仍在手动进行其他操作。对您来说,这是一种美化的ViewHolder模式。

如果正确使用数据绑定和可观察变量,则不必关心线程。 Android将为您处理。当您更新可观察值时,它将自动确保使用正确的ui线程来更新ui。

但是,您没有这样做。您正在手动使用binding.uielement.property = newValue 那没什么不同 findViewById(someView).property = newValue 事实就是它已经为您完成了findview。

这不是要使用绑定的方式。您也可以返回到findById的标准编码,然后将其设置为完全没有从绑定中受益。

如果您希望通过绑定进行管理。您应该创建一个可观察的类,并将其传递给onCreate,以允许它通过更新UI的属性为您管理绑定和更新。

现在,如果您删除与绑定有关的部分,而只是问您的runOnUIThread问题是什么,那就不一样了。必须要查看所涉及的完整类,以及您要影响的版式和嵌套版式的xml,然后我们才能开始深入研究。