android 下webview 如何判断404?

我在使用

 @Override
        public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
            super.onReceivedError(view, request, error);
            PtrCLog.d("WebFragment", "onReceivedError: " + "");

        }
        
        

这个方法并没有被回掉查看了一下说是需要API23 才可以。。有大佬知道有别的方法获取404吗?

阅读 5.5k
2 个回答
        new WebViewClient() {
            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                super.onReceivedError(view, errorCode, description, failingUrl);
                if (errorCode == 404) {
                    doSomething();
                }
            }

            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                super.onReceivedError(view, request, error);
                if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
                    int errorCode = error.getErrorCode();
                    if (errorCode == 404) {
                        doSomething();
                    }
                }
            }
        };

在onPageStarted里边跑一个AsyncTask,在AsyncTask里用OkHttpClient之类的Http客户端对需要访问的URL进行一次请求,取得code

    class WebViewStatusRequester extends AsyncTask<String, String, Integer> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            web.setVisibility(View.GONE);
        }
        @Override
        protected void onPostExecute(Integer result) {
            super.onPostExecute(result);
            if(result == 1) {
                web.setVisibility(View.VISIBLE);
            } else if(result == 0) {
                showLoadFail();
            }
        }
        @Override
        protected Integer doInBackground(String... params) {
            String url = params[0];
            if(url.substring(0, 4).equals("file") == false) {
                try {
                    OkHttpClient client = new OkHttpClient();
                    Request request = new Request.Builder().url(url).build();
                    Response response = client.newCall(request).execute();
                    if(response.isSuccessful()) {
                        return 1;
                    } else {
                        Log.i("TAG", "fail code:" + response.code());
                        return 0;
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return 0;
            }
            return 1;
        }
    }

在这里实际上是Webview和OkHttpClient进行了加载,只是AsyncTask跑的时候把WebView隐藏起来了,确认是200了就显示,不是200就显示加载失败的页面

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题