将辅助功能事件传递到后台线程获取 null

问题描述 投票:0回答:3

尝试使用Android AccessibilityService,将AccessibilityEvent传递给AsyncTask,但AccessibilityEvent中的所有值都消失了,例如mEventTime变为0,mPackageName变为null等。无法理解这里发生了什么

public class MyAccessibilityService extends AccessibilityService {

public void onAccessibilityEvent(AccessibilityEvent event) {
    new MyTestAsync().execute(event); //event not null 
}

 public class MyTestAsync extends AsyncTask<Object, Void, Void> {

        private AccessibilityEvent event;

        @Override
        protected ArrayList<AccessibilityNodeInfo> doInBackground(Object... params) {
               this.event = (AccessibilityEvent) params[0]; //getting null values in event  like mEventTime = 0, mPackageName = null
}
}

捕获以下类型的事件

android:accessibilityEventTypes="typeWindowStateChanged|typeViewFocused|typeWindowContentChanged"
android android-asynctask nullpointerexception accessibilityservice accessibility
3个回答
2
投票

Event 对象可由操作系统重用。接收者不拥有它。操作系统不会不断创建新事件。事实上,在正常情况下它只创建很少的可重用的(甚至可能只有 1 个)。通过在后台线程中对事件进行操作,当您开始对事件对象进行操作时,事件对象中的值将完全失效。你很幸运,它们都是空的,而不是随机的东西会让你相信这种方法是伪工作。

解决方案:创建您自己的事件包装器,从您需要的事件中复制值,然后将其传递给您的 AsyncTask。


1
投票

AccessibilityService#onAccessibilityEvent
中交给你的事件对象仅在该方法调用期间有效。

如果您需要推迟使用它,可以使用

AccessibilityEvent.obtain(originalEvent)
制作副本,然后传递该新对象。


0
投票

我在这里解决这个问题:https://stackoverflow.com/a/78226322/4882029

我花了两周时间才发现这个解决方案

© www.soinside.com 2019 - 2024. All rights reserved.