gpt4 book ai didi

android - Jellybean/ICS Android HTTP Post 方法 + WebView.RestoreState

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:43:28 25 4
gpt4 key购买 nike

我正在使用 API 17 模拟器测试包含 WebView 的页面。

  1. WebView 首先使用 GET 方法加载页面。
  2. 然后用户使用 HTTP POST 方法提交 Web 表单,这会导致加载第二个页面。
  3. 此时,如果我旋转屏幕,我会收到如下所示的“网页不可用”错误。只有在使用 POST 方法加载页面时才会发生这种情况。注意:我正在尝试使用 webview.restoreState 恢复 webview 的状态(参见下面的代码)。有没有办法告诉 Android 重新发布表单数据并重新加载页面而不是显示此错误消息?!

我无法在 KitKat、Lollipop 或 Gingerbread 上重现同样的问题……到目前为止,我只能在 Jellybean 和 Ice Cream Sandwich 上重现这个问题……

我还确认这是运行 Jellybean 的实际 Nexus 7 设备上的一个问题,因此它不仅仅是模拟器的问题。

注意:我对使用类似 android:configChanges="orientation|keyboardHidden"的东西不是特别感兴趣。据我了解,这可能会解决我的轮换问题,但如果由于其他原因需要恢复 Activity 状态,问题可能仍会再次出现。


截图:

第 1 步:正常加载 WebView

Step 1

第 2 步:提交表单(使用 HTTP Post 方法)

Step 2

第 3 步:旋转屏幕以触发 webview.restoreState - 发生错误

Step 3


代码:

下面是一些示例代码来配合我的问题。代码是在 Mono C# 中,但应该与 Java 几乎相同。

public class MainActivity : Activity
{
WebView webview;

protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);

webview = new WebView(this);
SetContentView(webview);

if (bundle == null)
webview.LoadUrl("http://2-dot-npwc-services.appspot.com/test-post.jsp");
else
webview.RestoreState(bundle);
}

protected override void OnSaveInstanceState(Bundle bundle)
{
base.OnSaveInstanceState(bundle);
webview.SaveState(bundle);
}
}

执行 POST 方法的示例 HTML 页面如下所示:

<html>
<form action="test-post.jsp" method="post">
<input type="text" name="test" value="test"/>
<input type="submit"/>
</form>

<p>You entered: <%=request.getParameter("test")%></p>
</html>

最佳答案

浏览器它做得很好(虽然这对我们来说很痛苦),你有两种方法:

1- 保留 webView 实例并恢复状态,如您所说添加 android:configChanges="orientation|keyboardHidden"

2- 或者重新加载帖子请愿书。

我选择第一页,如果出现错误,我将返回到最后一页。制作静态内容,因此在轮换时没有网络或每次轮换都需要一个新的请愿书,如果没有,在服务器端也会很痛苦。

要实现“如果错误返回”,您需要设置自定义 WebClient 并覆盖此方法

webview.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedError(WebView webView, int errorCode, String description, String failingUrl) {
if ( webView.canGoBack() ) {
Toast.makeText(MainActivity.this, R.string.error_web, Toast.LENGTH_SHORT).show();
webView.goBack();
}
}
});

您可以按错误代码过滤以在需要时返回,在某种错误中您可以返回其他地方做其他事情。我不知道哪个错误会引发此 POST 请求,或者您是否希望在其他情况下进行更多过滤,所以我确定您可以使用它进行细粒度过滤。

编辑:这里有可能的错误代码 WebViewClient Error Codes

希望对您有所帮助。

关于android - Jellybean/ICS Android HTTP Post 方法 + WebView.RestoreState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29483016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com