Проблема с WebView и findAllAsync на Nougat, стек перепутался? - PullRequest
0 голосов
/ 10 ноября 2018

У меня проблема с запуском WebView на Android 7.1.1, API 25. Программа отлично работает на Android 4.4.2, API 19. minSdkVersion - 16, targetSdkVersion - 28, compileSdkVersion - 28 и buildToolsVersion - 28.0.3

Проблема возникает только после этого вызова findAllAsync, который правильно находит все объекты ...

browser.findAllAsync(token.getText().toString());

Я изучил другие варианты в упражнении, и ни один из них не привел к этой ошибке.

Проблема в : после вызова любого из методов WebView goBack (), goForward () или reload () он возвращается к следующему выражению [return] OK, затем, кажется, возвращается обратно через стек правильно, но, наконец, уходит в явно случайное место, которое просто отображает мое «не найденное» сообщение. Похоже, что стек испорчен, так что сначала он не возвращается в правильное место, но затем находит произвольный возврат и продолжает.

Первый вопрос , мне интересно, сталкивался ли я с этим вопросом из https://developer.android.com/about/versions/android-4.4 ...

"Если ваше приложение использует WebView ... Ваше приложение может вести себя по-другому ... особенно, когда вы обновляете targetSdkVersion вашего приложения до" 19 "или выше ... Код, лежащий в основе класса WebView и связанных API, был обновлен .. Это обновление означает, что если ваше приложение использует WebView, на его поведение в некоторых случаях может повлиять. Хотя известные изменения поведения документированы и затрагивают ваше приложение в основном только при обновлении targetSdkVersion вашего приложения до «19» или выше ... возможно, что Ваше приложение зависит от неизвестного поведения предыдущей версии WebView. "

Отладка : я поместил одну точку останова на каждый из goBack, goForward и reload (), другую на каждую из соответствующих инструкций возврата и другую в коде для сообщения «not found». Когда программа достигла любого из трех вызовов метода, я ее F8 сделал; программа вернулась к возвращению, затем после того, как серия F8, казалось, возвращалась правильно, но в конечном итоге нашла свой путь к несвязанному «не найденному» коду.

В частности, в ответ на серию F8 программа проходит через эту последовательность классов ... ToolBar.class, MenuBuilder.class, SubMenuBuilder.class, MenuItemImpl.class [где известно, что itemImpl является правильным, так что процесс возврата должен быть корректным по крайней мере до этой точки], OnItemClick в MenuPopup.class и, наконец, OnItemClickListener в AdapterView .Джава. После чего дальнейшее использование F8 приводит к «Исходному коду не совпадает с байтовым кодом», и F9 продолжает к «не найденному» коду.

Второй вопрос , Может ли эта проблема быть вызвана несовместимостью различных вариантов xxxxSdkVersion и, возможно, некоторыми неясными требованиями либо findAllAsnyc, либо WebView?

Последовательность классов, переданных при возврате, кажется корректной, по крайней мере, до MenuItemImpl, поскольку она знает, что itemImpl является корректным в этот момент. Тогда кажется, что стек возвратов испорчен.

Последний вопрос , Какая может быть подходящая стратегия отладки для выявления и исправления ошибки? Я думаю, что мне нужно что-то читать, но я не знаю, что это может быть.

Какой-то код ...

defaultConfig {
    applicationId "com.webs.mdawdy.htmlspyii"
    minSdkVersion 16
    targetSdkVersion 28
    ... 
}

switch (menuItem.getItemId()){
    case R.id.back:                 // Back
        browser.goBack();
        return true;
    case R.id.forward:              // Forward
         browser.goForward();
         return true;
    case R.id.reload:               // Reload
         browser.reload();
         return true;
    case R.id.findall:              // Find All
    if (token.getText().toString().equals(""))                       
       toast(getString(R.string.NoTokenErr));
    else                        
       browser.findAllAsync(token.getText().toString());
    return true;

При возврате программа забирается в этот метод, отображает сообщение «not found», затем возвращается туда, где и должно быть, как если бы в стеке отсутствовал один возврат, и это просто случается, чтобы найти один здесь, так что он не падает ...

    browser.setFindListener(new WebView.FindListener() {
    @Override
    public void onFindResultReceived(
        int activeMatchOrdinal, int numberOfMatches, 
                 boolean isDoneCounting) {
        if (isDoneCounting) {
           if (numberOfMatches == 0)
              toast("Not Found: " + token.getText().toString());
           TextView count = findViewById(R.id.textCount);
           String temp = "Found: " + 
          integer.toString(numberOfMatches);count.setText(temp);
        }
    }
});

Обновление, для предоставления дополнительной информации:

Я думаю, что моя проблема может быть в поврежденном стеке, хотя я могу ошибаться. Я новичок в стеке трассировки, поэтому я бродил в темноте. Я пытаюсь определить последовательность вызовов методов перед ошибкой toast ("Not Found:" + ... ") . Вот что я сделал ...

Я помещаю их в параметры командной строки, но поскольку программа фактически не падает, я ожидаю, что они ничего не сделают ...

--stacktrace --debug

и вызвал Thread.dumpStack () непосредственно перед выполнением ошибочного оператора, с точкой останова в следующей инструкции, в надежде выяснить, как она попала сюда ...

Thread.dumpStack();
toast("Not Found: " + token.getText().toString());

затем нашел это в выводе консоли и вставил в окно Analyze Stacktrace, затем OK в окно StackTrace ...

W/System.err: java.lang.Exception: Stack trace
W/System.err:     at java.lang.Thread.dumpStack(Thread.java:1377)
        at com.webs.mdawdy.HTMLWeb$3.onFindResultReceived(HTMLWeb.java:126)
W/System.err:     at android.webkit.WebView$FindListenerDistributor.onFindResultReceived(WebView.java:2301)
        at xq.a(SourceFile:135)
W/System.err:     at org.chromium.android_webview.AwContents.onFindResultReceived(SourceFile:721)
        at android.os.MessageQueue.nativePollOnce(Native Method)
W/System.err:     at android.os.MessageQueue.next(MessageQueue.java:323)
        at android.os.Looper.loop(Looper.java:136)
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6823)
        at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1557)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445)

Это вывод dumpStack? или я смотрю не в том месте? Я ожидал большего, чем это. Указывает ли этот текст последовательность методов, вызываемых перед вызовом dumpStack? В выводе на консоль есть гораздо больше информации как до, так и после нее.

Logcat содержит много и продолжается. Я не уверен, есть ли что-нибудь, чтобы помочь. Надеясь на какое-то руководство ...

...