Android WebView onReceivedError()

Joe*_*eld 32 android webview

有没有人知道在WebView中是否有办法拦截"找不到页面"或"页面未加载错误"?

根据android文档,onReceivedError()应该可以拦截.但我在一个应用程序测试它,我删除了错误的URL,它没有做任何事情.

我希望我的应用程序能够提供我自己的自定义错误消息,如果URL由于任何原因不可用.

这是没有做任何事情的代码:

public void onReceivedError(WebView view, int errorCode,
        String description, String failingUrl) {

    // custom error handling ... show and alert or toast or something
}
Run Code Online (Sandbox Code Playgroud)

and*_*evo 29

根据文档和我的经验,它应该工作得很好.您只需在WebView中设置WebClientwith overriden方法即可onReceivedError.

这是我的一些旧测试应用程序的片段:

 WebView wv = (WebView) findViewById(R.id.webView);
 wv.setWebViewClient(new WebViewClient() {
    @Override
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            Log.i("WEB_VIEW_TEST", "error code:" + errorCode);
            super.onReceivedError(view, errorCode, description, failingUrl);
    }
 });
Run Code Online (Sandbox Code Playgroud)

我已经测试过了,它运行得很好.检查您的日志,看看你得到了什么样的代码错误.希望能帮助到你.

  • 似乎只在加载错误(例如超时)时调用此方法,而不是404错误.(在这种情况下,页面成功加载,而不是状态200 OK) (5认同)
  • API中不推荐使用`onReceivedError`.使用`public void onReceivedError(WebView视图,WebResourceRequest请求,WebResourceError错误) (5认同)
  • 您可以尝试在'onReceivedError'中使用'loadData(...)'方法加载一些替代页面.它应该快速切换错误页面的内容...... (3认同)

R E*_*ris 11

我已尝试在shouldOverrideUrlLoading()内部和该方法之外使用onReceivedError但在WebViewClient中.我甚至在主要的Activity类中尝试过.我对结果不一致感到不满意.所以,我在此之前调用使用loadURL()上使用的测试方法,isOnline(),并要求解决.

public boolean isOnline() {
    ConnectivityManager cm = (ConnectivityManager) getBaseContext()
            .getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo i = cm.getActiveNetworkInfo();
    if ((i == null) || (!i.isConnected())) {
        Toast toast = Toast.makeText(getBaseContext(),
                "Error: No connection to Internet", Toast.LENGTH_SHORT);
        toast.setGravity(Gravity.TOP | Gravity.CENTER, 0, 0);
        toast.show();
        return false;
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

然后,这个onReceivedError位于WebViewClient中,但在overloadurlthingy方法之外.这似乎一直防止愚蠢,傻笑的android错误页面.

    @Override
    public void onReceivedError(WebView view, int errorCode,
            String description, String failingUrl) {
        if (view.canGoBack()) {
            view.goBack();
        }
        Toast toast = Toast.makeText(getBaseContext(), description,
                Toast.LENGTH_SHORT);
        toast.setGravity(Gravity.TOP | Gravity.CENTER, 0, 0);
        toast.show();
    }
Run Code Online (Sandbox Code Playgroud)

有些人可能会认为这种资源很重.嗯,不像Android Facebook和Google+应用程序那么重.而不是谷歌服务的方式.坦率地说,我不介意使用那些应用程序氧气.叫我一个坏男孩......