Android Webview - HTTP错误504网关超时

时间:2013-05-17 03:52:49

标签: android google-app-engine error-handling android-webview

我有使用webview显示Google App Engine网络应用的Android应用。如何覆盖我的应用中遇到的默认HTTP Error 504 Gateway timeout

HTTP Error 504 Gateway timeout

The server, while acting as a gateway or proxy, did not receive a 
timely response from the upstream server it accessed in attempting 
to complete the request.

我已经覆盖onReceivedError,当没有可用的互联网连接和其他错误时,它会正常工作。

webView.setWebViewClient(new WebViewClient(){
    ...

    @SuppressLint("DefaultLocale")
    @Override
    public void onReceivedError(WebView view, int errorCode,String description, String failingUrl) {

        try {
            String template = streamToString(getAssets().open("html/error.html"));
            String data = template.replaceAll("%DESCRIPTION%", description.toLowerCase())
                    .replaceAll("%WEBSITE_URL%", WEBSITE_URL);

            view.loadDataWithBaseURL("file:///android_asset/html/", data, "text/html", "utf-8", null);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

});

onReceivedError无法收到HTTP错误只有网络错误?任何解决方法? android webview如何拦截HTTP错误?

1 个答案:

答案 0 :(得分:0)

实际上,由于连接性较低或网络相关原因,您的请求已超时;您可以这样显示自定义页面:

  webview.setWebViewClient(new WebViewClient() {
            /* (non-Javadoc)
            * @see android.webkit.WebViewClient#onPageStarted(android.webkit.WebView, java.lang.String, android.graphics.Bitmap)
            */
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                System.out.println("page loading started");
                // TODO Auto-generated method stub
                if(!isNetworkAvailable2())
                {
                    //showInfoMessageDialog("network not available");
                   //load here your custom offline page for handling such errors

                    System.out.println("network not available");
                    return;
                }
                else System.out.println("network available");

                super.onPageStarted(view, url, favicon);

            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                isConnected=isNetworkAvailable2();
                if (isConnected) {
                    // return false to let the WebView handle the URL
                    return false;
                } else {
                    // show the proper "not connected" message
                // view.loadData(offlineMessageHtml, "text/html", "utf-8");
                    // return true if the host application wants to leave the current 
                    // WebView and handle the url itself
                    return true;
                }
            }
            @Override
            public void onReceivedError (WebView view, int errorCode, 
                String description, String failingUrl) {
                if (errorCode == ERROR_TIMEOUT) {
                    view.stopLoading();  // may not be needed
                // view.loadData(timeoutMessageHtml, "text/html", "utf-8");
                }
            }
        });
        //webview.setWebChromeClient(new WebChromeClient());        
    }

Credits to the original answer here.