在牛轧糖上使用WebView和findAllAsync遇到问题,堆栈搞砸了吗?

时间:2018-11-09 22:18:53

标签: android-webview findall android-7.1-nougat

我在Android 7.1.1,API 25上运行WebView时遇到问题。该程序在Android 4.4.2,API 19上完美运行。minSdkVersion为16,targetSdkVersion为28,compileSdkVersion为28,buildToolsVersion为28.0.3 < / p>

仅在对findAllAsync的调用之后才发生问题,该调用可正确找到所有对象...

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

我已经探索了活动中的其他选择,没有一个导致此错误。

问题是:在调用任何WebView方法goBack(),goForward()或reload()之后,它返回到以下语句[返回] OK,然后似乎是正确地通过堆栈返回,但最后走到一个明显随机的地方,恰好显示我的“未找到”消息。看来,堆栈已弄乱了,因此起初它不会返回到正确的位置,而是随后找到任意返回并继续进行。

第一个问题,我想知道我是否从 https://developer.android.com/about/versions/android-4.4 ...

“如果您的应用程序使用WebView,则您的应用程序的行为可能有所不同...尤其是当您将应用程序的targetSdkVersion更新为” 19“或更高版本时... WebView类和相关API的代码已升级.. 。此升级意味着如果您的应用使用WebView,则在某些情况下它的行为可能会受到影响,尽管已知的行为更改已记录在案,并且仅在将应用的targetSdkVersion更新为“ 19”或更高版本时才会对您的应用产生影响...您的应用程序依赖于先前版本的WebView中的未知行为。”

调试:我在goBack,goForward和reload()的每一个上放置了一个断点,在每个对应的return语句上放置了一个断点,在“未找到”消息的代码中放置了一个断点。当程序到达这三个方法调用中的任何一个时,我将其按F8键;该程序确实返回了返回,然后在一系列F8似乎正确返回之后,却最终找到了与无关的“未找到”代码的方式。

特别是,响应于F8系列,该程序蜿蜒回到该类序列... ToolBar.class,MenuBuilder.class,SubMenuBuilder.class,MenuItemImpl.class(知道itemImpl是正确的,因此返回过程至少应该在这一点上正确),MenuPopup.class中的OnItemClick,最后是AdapterView中的OnItemClickListener .java。之后,进一步使用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;

在返回时,程序会陷入这种方法, 显示“未找到”消息,然后返回到应有的状态,好像堆栈中缺少一个返回值, 碰巧在这里找到一个,所以不会崩溃...

    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);
        }
    }
});

更新以提供更多信息:

我认为我的问题可能是堆栈损坏,尽管我可能错了。我是stacktrace的新手,所以我在黑暗中徘徊。我正在尝试确定错误的 toast(“ Not Found:” + ...“)之前的方法调用顺序。这是我所做的...

我将它们放在命令行选项中,但是由于该程序实际上并未崩溃,所以我希望它们不会做任何事情...

--stacktrace --debug

并在执行该错误语句之前直接调用Thread.dumpStack(),并在以下指令上带有一个断点,希望找出它是如何到达的...

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

然后在控制台输出中找到它,并将其粘贴到“ Analyze Stacktrace”窗口中,然后确定进入“ 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包含很多内容并继续。我不确定是否有什么需要帮助的。希望获得一些指导...

0 个答案:

没有答案