代码之家  ›  专栏  ›  技术社区  ›  Atul Kumar

Android runOnUiThread()线程正在波动

  •  -1
  • Atul Kumar  · 技术社区  · 8 年前

    在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 回复  |  直到 8 年前
        1
  •  1
  •   Sam    8 年前

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

    如果您正确地使用了数据绑定和可观察性,那么您不应该关心您的线程。安卓会帮你处理的。当您更新一个可观察的值时,它将自动确保使用正确的ui线程来更新ui。

    但是,你没有这么做。您正在手动使用binding.uielement.property=newValue 那也没什么不同 findViewById(someView.property=newValue 另一个事实是它已经为你做了调查。

    这不是绑定的用途。您不妨回到findById的标准编码,然后设置它,因为您根本没有从绑定中获益。

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

    现在,如果你放下与装订有关的部分,问问你的runOnUIThread问题是什么,那就不一样了。必须看到涉及的完整类、布局的xml和您试图影响的嵌套布局,然后我们可以开始挖掘更多内容。