将可访问性事件传递给反向读取为空

时间:2018-05-22 09:54:20

标签: android android-asynctask nullpointerexception accessibilityservice android-accessibility

尝试使用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"

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

如果您需要推迟使用它,您可以使用 AccessibilityEvent.obtain(originalEvent) 制作一个副本,然后传递那个新对象。