Android 10: «Обнаружен возможный тупик из-за того, что API-интерфейс WebView вызывается в неверном потоке, когда поток пользовательского интерфейса заблокирован» - PullRequest
0 голосов
/ 23 октября 2019

Мое приложение состоит из Фрагментов с полноэкранным режимом WebView . Когда пользователь нажимает на ссылку в WebView , открывается новый Фрагмент с новым WebView с тем же URL . Перед открытием новой Фрагмент закрываю софт-клавиатуру на всякий случай. Я открываю новую страницу очень быстро. Все операции выполняют в основном потоке.

По Crashlytics проблема возникает только на Android 10 (все устройства серии Pixel и другие устройства с 10). На устройствах до Android 10 все работает нормально. Я могу многое открыть Фрагменты . Но на устройствах Android 10 этот случай приводит к ИСКЛЮЧИТЕЛЬНОМУ ИСКЛЮЧЕНИЮ (после 2-3 быстрых попыток случайного открытия новой страницы):

E/AndroidRuntime: FATAL EXCEPTION: pool-1-thread-1
Process: <myapp>, PID: 12487
java.lang.RuntimeException: Probable deadlock detected due to WebView API being called on incorrect thread while the UI thread is blocked.
    at Yp.a(PG:13)
    at com.android.webview.chromium.WebViewChromium.onCheckIsTextEditor(PG:4)
    at android.webkit.WebView.onCheckIsTextEditor(WebView.java:3035)
    at android.view.inputmethod.InputMethodManager.checkFocusNoStartInput(InputMethodManager.java:1901)
    at android.view.inputmethod.InputMethodManager.checkFocus(InputMethodManager.java:1863)
    at android.view.inputmethod.InputMethodManager.hideSoftInputFromWindow(InputMethodManager.java:1506)
    at android.view.inputmethod.InputMethodManager.hideSoftInputFromWindow(InputMethodManager.java:1475)
    at <myapp>.Utils.hideKeyboard(Utils.java:175)
    at <myapp>.openNewPage(Pager.java:210)
    ...
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:919)
 Caused by: java.util.concurrent.TimeoutException
    at java.util.concurrent.FutureTask.get(FutureTask.java:206)
    at Yp.a(PG:11)

Я пытался использовать все доступные версии Android System WebView (стабильный, бета, dev, canary), но ничто не поможет.
Кто-нибудь может мне помочь?

Обновление :
Если я прокомментирую код для скрытия программной клавиатурытогда все работает нормально.

Ответы [ 2 ]

1 голос
/ 24 октября 2019

Это не решение, только объяснить проблему.

Сначала вы сказали «Все операции выполняются в главном потоке.», Но это неправильно. Деревья стека указали, что он находится в рабочем потоке.

И это также может быть подтверждено из исходного кода. Задача блокировки WebView .

Во-вторых, код изменился в Android Q, который проверяет представление текстового редактора из этой версии.

В-третьих, выопубликовать одну задачу, используя View.post (). Он находится в потоке пользовательского интерфейса, а процесс отличается в WebView (т. Е. Не нужно ждать и блокировать)и WebView хочет сделать это в потоке пользовательского интерфейса, но не получает результат за время ожидания (4 секунды).

Так как у вас слишком много работы в потоке пользовательского интерфейса

0 голосов
/ 23 октября 2019

Я нашел решение, но не уверен, что оно правильное. Если кто-нибудь знает причину этого сбоя или более элегантное решение, я буду благодарен.

Решение : обтекание hideSoftInputFromWindow () в View.post () :

public static void hideKeyboard(@NotNull Context context, @NotNull View view, int flags) {
  view.post(() ->
    ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE))
      .hideSoftInputFromWindow(view.getWindowToken(), flags));
}
...