我正在使用可访问性服务在屏幕上找到一个按钮并单击它,但是由于某种原因,我遇到了以下错误:
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中,但仍然使我的应用程序崩溃。
答案 0 :(得分:0)
进行密封以使节点不可变。当服务在回收后使用节点时,通常会发生此类异常。
答案 1 :(得分:0)
(这很痛苦,但是如果放弃了某个节点,它的大多数功能都会令人震惊地崩溃-甚至refresh()
。这很奇怪,因为据我所知,您可以保留实例的时间长至您需要它们。)
您可以通过检查getClassName()
是否返回null来轻松检查其中一个是否仍然有效-如果确实返回null,则将其像土豆一样放下!您再也无法执行任何操作-甚至recycle()
都不要这样做,因为脚下已经有东西在做。