Работа с AccessibilityNodeInfo вызвала ошибку размера стека 8 МБ - PullRequest
0 голосов
/ 09 января 2019

Я использовал сервис доступности, чтобы вывести все тексты на экран. После нескольких минут нормальной работы он вызвал ANR с некоторыми GC allocated... журналами, а через несколько секунд произошел сбой с этой ошибкой: enter image description here

@Override
public void onAccessibilityEvent(final AccessibilityEvent event) {
    try {
        PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
        if (powerManager == null || !powerManager.isInteractive()) {
            return;
        }
        if (FirebaseAuth.getInstance().getCurrentUser() == null) return;
        CharSequence eventPackageName = event.getPackageName();
        if (eventPackageName != null) {
            if (eventPackageName.equals(BuildConfig.APPLICATION_ID)) return;
            if (eventPackageName.equals(getCurrentKeyboardPackageName())) return;
            int eventType = event.getEventType();
            if (eventType == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED || eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
                    AccessibilityNodeInfo mNodeInfo = event.getSource();
                    StringBuilder stringBuilder = new StringBuilder("");
                    getAllTextViews(mNodeInfo, stringBuilder);
                    String value = stringBuilder.toString().replace('\n', ' ').replaceAll(" +", " ");
            }

        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Мой getAllTextViews() метод:

private void getAllTextViews(AccessibilityNodeInfo nodeInfo, StringBuilder stringBuilder) {
        if (nodeInfo == null) return;
        if (!TextUtils.isEmpty(nodeInfo.getText())) {
            stringBuilder.append(" " + nodeInfo.getText());
        }
        for (int i = 0; i < nodeInfo.getChildCount(); i++) {
            getAllTextViews(nodeInfo.getChild(i), stringBuilder);
        }
    }

Любая помощь будет оценена. Большое спасибо!

1 Ответ

0 голосов
/ 17 января 2019

Вам нужно использовать recycle() метод AccessibilityNodeInfo после использования информации.

...