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

cra*_*s84 9 android http-post webview

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

  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"之类的东西并不是特别有趣.据我了解,这可能会解决我的轮换问题,但如果由于其他原因需要恢复活动状态,问题仍可能重新出现.


截图:

步骤#1:正常加载WebView

步骤1

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

第2步

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

第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);
    }
}
Run Code Online (Sandbox Code Playgroud)

执行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>
Run Code Online (Sandbox Code Playgroud)

Sul*_*ain 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();
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

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

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

我希望这有帮助。