android - Webview shouldOverrideUrlLoading 不捕获 URL 请求
问题描述
我正在尝试解析每个点击事件,拦截尝试加载到 webview 中的 http url,并根据 url 的解析方式决定是否应该根据一组逻辑显示它。我遵循了关于这 3 个 StackOverflow 链接的建议:
2) Android Web-View shouldOverrideUrlLoading() 已弃用。(替代)
3) https://stackoverflow.com/a/32711309/2480714
没有它解决我的问题。主要问题是用户单击 web 视图以加载超链接,并且似乎没有调用shouldOverrideUrlLoading方法或每次都没有正确拦截 url。
我创建了我的自定义 WebViewClient 并首先覆盖它,目的是在未经我批准的情况下停止所有负载,但我遇到了障碍;一些url 正在加载和绕过我的覆盖方法,而有些则没有。我不知道为什么会这样。
这是我的 WebviewClient 类:
public class CustomWebViewClient2 extends WebViewClient {
public CustomWebViewClient2(){
}
@Override
public void onPageFinished(WebView view, String url) {
Log.d("log", "(CustomWebViewClient) onPageFinished, URL == " + url);
}
@SuppressLint("NewApi")
@Nullable
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
Log.d("log", "shouldInterceptRequest hit");
return null;
}
@Nullable
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
Log.d("log", "shouldInterceptRequest hit");
return null;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
Log.d("log", "(CustomWebViewClient) shouldOverrideUrlLoading");
return true;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.d("log", "(CustomWebViewClient) shouldOverrideUrlLoading");
return true;
}
@Override
public void onLoadResource(WebView view, String url) {
Log.d("log", "intercepting onLoadResource, url == " + url);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Log.d("log", "onPageStarted url == " + url);
}
}
如您所见,它覆盖了正确的方法,并且(理论上)不应该加载 URL,除非我将它传递给 webview 进行加载,但不幸的是,有些网站正在加载,而另一些则没有。
我还尝试根据答案之一中的此评论禁用缓存:
“请注意!如果您拦截了浏览器检索图像(或可能是任何资源)的尝试,然后返回 null(意味着让 WebView 继续检索图像),任何未来对该资源的请求都可能会转到缓存并且不会触发 shouldInterceptRequest()。如果要拦截每个图像请求,则需要禁用缓存或(我所做的)调用 WebView.clearCache(true)"
但无济于事。为什么某些 URL 会加载并绕过覆盖,而其他 URL 则不会?
更新 1:这是一个示例 URL https://cookpad.com/us,它反映了我所指的问题。它似乎与在服务器端实现的 Turbolinks 有关。
解决方案
推荐阅读
- python - 在 PySpark StructStream 中,如何查找组中的每一行与上一行之间的时间差
- reactjs - 自动完成 - MaterialUI - 受控组件不起作用
- c - 如何解决 C 中的 gets() 函数的问题?
- javascript - 如何使用 ReactJS 钩子设置输入值?
- c++ - 调用者和被调用者中数组元素的值不同
- sas - 为唯一记录设计新的 RK 编号
- vue.js - Vuex Computed 属性中的错误已分配给但它没有设置器
- java - Eclipse 文件夹中的圆形取消标志是什么意思?
- javascript - 如何从一个包含对象的大数组中获取两个单独的数组?
- oracle-apex - Oracle Apex 主页 URL 问题 - 固定页面不是动态的