java.lang.IllegalStateException:无法在未密封的实例上执行此操作

时间:2019-02-23 16:25:44

标签: android accessibilityservice

我正在使用可访问性服务在屏幕上找到一个按钮并单击它,但是由于某种原因,我遇到了以下错误:

java.lang.IllegalStateException: Cannot perform this action on a not sealed instance.
    at android.view.accessibility.AccessibilityNodeInfo.enforceSealed(AccessibilityNodeInfo.java:3046)
    at android.view.accessibility.AccessibilityNodeInfo.findAccessibilityNodeInfosByText(AccessibilityNodeInfo.java:1529)
    at com.myapp.adapters.Adapter_Click$11.run(Adapter_Click.java:1874)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6718)
    at java.lang.reflect.Method.invoke(Method.java:-2)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

它所指的行是:

List<AccessibilityNodeInfo> list = source.findAccessibilityNodeInfosByText("Accept".toLowerCase());

然后我用它来单击按钮:

if (view.performAction(AccessibilityNodeInfo.ACTION_CLICK)) 
{
  Log.e(TAG, "Button clicked");
}

在最近一次更新到AndroidX之前,去年我没有发现任何问题。有没有办法在尝试单击它之前检查它是否为密封实例?我什至尝试将其包装在try / catch中,但仍然使我的应用程序崩溃。

2 个答案:

答案 0 :(得分:0)

进行密封以使节点不可变。当服务在回收后使用节点时,通常会发生此类异常。

答案 1 :(得分:0)

(这很痛苦,但是如果放弃了某个节点,它的大多数功能都会令人震惊地崩溃-甚至refresh()。这很奇怪,因为据我所知,您可以保留实例的时间长至您需要它们。)

您可以通过检查getClassName()是否返回null来轻松检查其中一个是否仍然有效-如果确实返回null,则将其像土豆一样放下!您再也无法执行任何操作-甚至recycle()都不要这样做,因为脚下已经有东西在做。