【问题标题】:Jellybean/ICS Android HTTP Post Method + WebView.RestoreStateJellybean/ICS Android HTTP Post 方法 + WebView.RestoreState
【发布时间】:2015-04-07 03:05:12
【问题描述】:

我正在使用 API 17 模拟器来测试包含 Web 视图的页面。

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

我无法在 KitKat、Lollipop 或 Gingerbread 上重现同样的问题...目前我只能在 Jellybean and Ice Cream Sandwich 上重现此问题...

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

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


截图:

第 1 步:正常加载 WebView

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

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


代码:

这里有一些示例代码可以解决我的问题。代码在 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>

【问题讨论】:

  • 您是否尝试为 WebView 小部件提供 id?我不知道它是否有帮助,但我知道如果一个小部件没有与之关联的 id,Android 不会通过配置更改保留它所持有的内容。在早期版本中,这曾经导致奇怪的错误。也许这就是你所看到的?
  • 您可以提供任何 ID。你能告诉我们你发现了什么吗?
  • 两种方法我都试过了。即使在为 webview 提供 id 时,我也会遇到同样的错误(我从布局中夸大了 webview)
  • 仅供参考。从 Android 4.4 及更高版本开始,WebView 基于 Blink。在此之前,它是基于 WebKit 渲染引擎的。
  • 是的,这可能是问题的一部分。尽管如果可能的话,我仍然想修复它。另外我觉得我在 Gingerbread 上没有遇到这个问题有点奇怪。

标签: android webview http-post


【解决方案1】:

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

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

我希望这会有所帮助。

【讨论】:

  • 谢谢。仅供参考,errorCode 是 Android.Webkit.ClientError.Connect - 无法连接到服务器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 2017-03-16
  • 2012-08-22
  • 2011-10-21
  • 1970-01-01
相关资源
最近更新 更多