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

时间:2015-04-07 03:05:12

标签: android webview http-post

我使用API​​ 17模拟器测试包含网页视图的网页。

  1. webview首先使用GET方法加载页面。
  2. 然后,用户使用HTTP POST方法提交Web表单,这会导致第二页加载。
  3. 此时如果我旋转屏幕,我会收到"网页不可用"错误见下文。仅当使用POST方法加载页面时才会出现这种情况。注意:我尝试使用webview.restoreState恢复webview的状态(请参阅下面的代码)。有没有办法告诉Android重新发布表单数据并重新加载页面而不是显示此错误消息?!
  4. 我无法在KitKat,Lollipop或Gingerbread上重现同样的问题......到目前为止,我只能在Jellybean和Ice Cream Sandwich上重现这个问题......

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

    注意:我在使用像android这样的东西时并不是特别有趣:configChanges =" orientation | keyboardHidden"。据我了解,这可能会解决我的轮换问题,但如果由于其他原因需要恢复活动状态,问题仍可能重新出现。


    屏幕截图:

    步骤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 个答案:

答案 0 :(得分:1)

浏览器表现良好(虽然这对我们来说很痛苦),但您有两种方式:

1-保持webView实例并恢复状态,像你说的那样添加 android:configChanges =“orientation | keyboardHidden”

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

我拿第一个,如果我得到一些错误,我会回到最后一页。做静态内容,所以在轮换时没有网络或每次轮换需要新的请求,如果没有,在服务器端也会很痛苦。

要实现“if error return”,您需要设置Custom 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();
        }
    }
});

你可以通过errorCode进行过滤,以便在需要时返回,在某种错误中你可以返回其他做其他事情。我不知道哪个错误引发了这个POST请求,或者你想要在其他情况下使用更多过滤器,所以我确信你可以使用它做一个细粒度过滤器。

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

我希望这会有所帮助。