Android并发编程高级面试题汇总最全最细面试题讲解持续更新中👊👊
👀你想要的面试题这里都有👀
👇👇👇
Android WebView拦截请求的方式
这道题想考察什么?
考察WebView 的基本用法中拦截请求的方式,这个也是开发中常用的技能
考生应该如何回答?
如果想做webview的本地缓存或者拦截请求做其他的事情就设计到了拦截webview的请求。
如何去做呢?
我们先简单的回顾一下Webview loadUrl的方式。
WebView的基本用法相信大多数android开发者都是会使用的,最简单的就是调用个loadUrl方法,但是记得要在清单文件中添加网络权限。
mWebview = (WebView) findViewById(R.id.my_webview);
mWebview.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return false;
}
});
mWebview.loadUrl("https://www.baidu.com/");
在Android自带的WebView中,如果需要对访问的URL或者资源进行拦截,主要涉及到WebViewClient中的三个方法:onPageStarted、shouldOverrideUrlLoading、shouldInterceptRequest。首先来分析onPageStarted方法和shouldOverrideUrlLoading方法,分别在两个方法以及onPageFinished方法中打印log。
a) 当用户使用WebView的loadUrl方法开启一个网页时,其中onPageStarted方法会执行,而shouldOverrideUrlLoading则不会执行
b) 当用户继续点击网页内的链接时,onPageStarted和shouldOverrideUrlLoading均会执行,并且shouldOverrideUrlLoading要先于onPageStarted方法执行
c) 当用户点击网页中的链接后,点击back,返回历史网页时,onPageStarted会执行,而shouldOverrideUrlLoading不会执行
综上所述,当需要对访问的网页进行策略控制时,需要在onPageStarted方法中进行拦截,如下示例代码:
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Log.d(TAG, "onPageStarted url is " + url);
boolean res = checkUrl(url);
//根据对URL的检查结果,进行不同的处理,
//例如,当检查的URL不符合要求时,
//可以加载本地安全页面,提示用户退出
if (!res) {
//停止加载原页面
view.stopLoading();
//加载安全页面
view.loadUrl(LOCAL_SAFE_URL);
}
}
然后,来分析一下shouldInterceptRequest(WebView view, String url),此方法从Android API 11(3.0)开始提供,位于WebViewClient 内,当用户使用WebView的loadUrl方法打开网页、点击网页中的链接、返回历史网页时,所有资源的加载均会调用shouldInterceptRequest方法
进行资源替换时,可以将网页资源,例如html、css、js、图片等存放在本地,在shouldInterceptRequest对WebView加载的资源进行拦截,当符合某种策略时,替换为本地的资源,资源的MIME类型可以采用以下方法获取: MimeTypeMap.getSingleton().getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(url))
示例:
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
Log.d(TAG, "shouldInterceptRequest : " + url);
Uri uri = Uri.parse(url);
String localPath = "file://" + Environment.getExternalStorageDirectory().getAbsoluteFile() + "/www" + uri.getPath();
File file = new File(localPath);
try {
URL localUri = new URL(localPath);
if (localUri != null) {
InputStream is = localUri.openConnection().getInputStream();
WebResourceResponse resourceResponse = new WebResourceResponse(
MimeTypeMap.getSingleton().getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(url)), "UTF-8", is);
Log.d(TAG, "replace " + MimeTypeMap.getFileExtensionFromUrl(url));
return resourceResponse;
}
} catch (IOException e) {
e.printStackTrace();
}
return super.shouldInterceptRequest(view, url);
}
WebView中调用的每个请求都会经过那个拦截器,所以如果一个页面中又有超链接,那么依然会经过那个拦截器,所以上面Import new中有些图片没有加载出来。因为我是以本文形式获取响应的,并且是以utf-8作为编码的,所以有时会出现乱码。
由于面试题内容比较多,篇幅有限,资料已经被整理成了PDF文档,有需要2023年Android中高级最全面试真题答案 完整文档的可扫描下方卡片免费获取~
PS:(文末还有使用ChatGPT机器人小福利哦!!大家不要错过)
目录
第一章 Java方面
- Java基础部分
- Java集合
- Java多线程
- Java虚拟机
第二章 Android方面
- Android四大组件相关
- Android异步任务和消息机制
- Android UI绘制相关
- Android性能调优相关
- Android中的IPC
- Android系统SDK相关
- 第三方框架分析
- 综合技术
- 数据结构方面
- 设计模式
- 计算机网络方面
- Kotlin方面
第三章 音视频开发高频面试题
- 为什么巨大的原始视频可以编码成很小的视频呢?这其中的技术是什么呢?
- 怎么做到直播秒开优化?
- 直方图在图像处理里面最重要的作用是什么?
- 数字图像滤波有哪些方法?
- 图像可以提取的特征有哪些?
- 衡量图像重建好坏的标准有哪些?怎样计算?
第四章 Flutter高频面试题
- Dart部分
- Flutter部分
第五章 算法高频面试题
- 如何高效寻找素数
- 如何运用二分查找算法
- 如何高效解决雨水问题
- 如何去除有序数组的重复元素
- 如何高效进行模幂运算
- 如何寻找最长回文子串
第六章 Andrio Framework方面
- 系统启动流程面试题解析
- Binder面试题解析
- Handler面试题解析
- AMS面试题解析