我在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包含很多内容并继续。我不确定是否有什么需要帮助的。希望获得一些指导...