I am using Accessibility service in my application and getting ANR in onEvent method while calling event.getSource();
When i put this code in another thread, to resolve this above ANR it creates an exception:
java.lang.IllegalStateException: Cannot perform this action on a not sealed instance.
Please guide me how can i resolve it? Code is below:
@Override
public void onAccessibilityEvent(final AccessibilityEvent event) {
int eventType = event.getEventType();
if (eventType == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) {
OnEvent(this, event);
}
}
private void OnEvent(final Context context, AccessibilityEvent event) {
String eventText = "", eventPackageName = "", eventClassName = "";
try {
if (event.getText() != null && event.getText().size() > 0)
eventText = event.getText().toString();
if (event.getPackageName() != null)
eventPackageName = event.getPackageName().toString();
if (event.getClassName() != null)
eventClassName = event.getClassName().toString();
AccessibilityNodeInfo eventSource = event.getSource();
final AccessibilityEventModel accessibilityEventModel = new AccessibilityEventModel();
accessibilityEventModel.setPackageName(eventPackageName);
accessibilityEventModel.setEventText(eventText);
accessibilityEventModel.setEventClassName(eventClassName);
accessibilityEventModel.setEventSource(eventSource);
accessibilityEventModel.setParcelable(event.getParcelableData());
executorService.execute(() -> {
AccessibilityManager accessibilityManager = new AccessibilityManager(context, localDatabaseSource);
accessibilityManager.goThroughAccessibilityEvent(eventType,
accessibilityEventModel);
});
} catch (Exception e) {
Log.d(TAG, " Error: " + e.getMessage());
}
}
fun goThroughAccessibilityEvent(
eventType: AccessibilityEventType,
accessibilityEventModel: AccessibilityEventModel
) {
when (eventType) {
AccessibilityEventType.TYPE_WINDOW_CONTENT_CHANGED -> WindowContentChangeEventData(
localDatabaseSource
).onAccessibilityEvent(context, accessibilityEventModel)
}
}
I can't tell what you're actually doing with the
accessibilityEventModel
after it's generated, but you should try placing the wholetry/catch
(and any other logic that needs uses thataccessibilityEventModel
) block inside a background thread: