当前位置: 首页 > news >正文

企业网站建设的类型有哪些公司网站建设进度表

企业网站建设的类型有哪些,公司网站建设进度表,淘宝客网站建设难度大吗,免费的app推广平台作者#xff1a;newki 前言 Glide 相信大家都不陌生#xff0c;各种源码分析#xff0c;使用介绍大家应该都是烂熟于心。但是设置 Glide 的超时问题大家遇到过没有。 我遇到了#xff0c;并且掉坑里了#xff0c;情况是这样的。 调用接口从网络拉取用户头像#xff0c… 作者newki 前言 Glide 相信大家都不陌生各种源码分析使用介绍大家应该都是烂熟于心。但是设置 Glide 的超时问题大家遇到过没有。 我遇到了并且掉坑里了情况是这样的。 调用接口从网络拉取用户头像目前数据量不大大致1000多个人。用了自定义队列使用 Glide 下载头像到本地沙盒 File 为了方便的缓存下次更快。识别头像中的人脸信息并生成人脸Bitmap本身有成功失败的处理与重试机制生成人脸对应的特征并保存人脸特征数据和人脸特征图片到沙盒 File 。封装人脸对象并加载到内存中保持全局单例。场景业务与Camera的预览画面中获取到的活体人脸进行人脸比对。 开始并没有设置超时时间导致 Glide下载图片的自定义队列常常会出现卡死的情况导致整个队列执行缓慢甚至都无法继续执行整个注册服务被阻塞新进来的用户一直等待时间过长甚至无法注册。 问题嘛就是图片加载的问题有些图片无法加载有些图片太大加载时间过长有些根本就不是图片有些网络慢不稳定或者干脆就无网有些是访问权限问题为了让图片下载队列能正常运转加入了 Glide 的超时机制踩坑之路由此展开。 一、问题复现 Glide的使用大家应该都清除如何加timeout这里给出一个示例代码 依赖 implementation com.github.bumptech.glide:glide:4.15.1 implementation com.github.bumptech.glide:annotations:4.15.1 kapt com.github.bumptech.glide:compiler:4.15.1下载的方法使用一个扩展方法封装了一下 : fun Any.extDownloadImage(context: Context?, path: Any?, block: (file: File) - Unit) {var startMillis 0Lvar endMillis 0LGlideApp.with(context!!).load(path).timeout(15000) // 15秒.downloadOnly(object : SimpleTargetFile?() {override fun onLoadStarted(placeholder: Drawable?) {startMillis System.currentTimeMillis()YYLogUtils.w(开始加载$startMillis)super.onLoadStarted(placeholder)}override fun onLoadFailed(errorDrawable: Drawable?) {endMillis System.currentTimeMillis()YYLogUtils.w(Glide-onLoadFailed-Drawable,一共耗时:${endMillis - startMillis})super.onLoadFailed(errorDrawable)}override fun onResourceReady(resource: File, transition: Transitionin File??) {endMillis System.currentTimeMillis()YYLogUtils.w(Glide-onResourceReady-Drawable,一共耗时:${endMillis - startMillis})block(resource)}})}大家使用工具类或者直接 Glide 写都是一样的效果不影响最终的结果。 使用 val url https://s3.ap-southeast-1.amazonaws.com/yycircle-ap/202307/11/KZ8xIVsrlrYtjhw3t2t2RTUj0ZTWUFr2EhawOd4I-810x1080.jpegextDownloadImage(thisMainActivity, url, block { file -YYLogUtils.w(file:${file.absolutePath})})以亚马逊云服务的图片地址为例不同的网络情况不同的网络加载框架情况下分别有什么不同。 1.1 HttpURLConnection 没网的情况 原生 Glide 的网络请求源码在 HttpUrlFetcher 类中。 具体方法 就算我们在 buildAndConfigureConnection 中设置了超时时间但是 connect 方法直接就报错了也不会走timeout的逻辑 com.bumptech.glide.load.HttpException: Failed to connect or obtain data, status code: -1 1.1 HttpURLConnection 有网的但是不通 那如果有网但是网不通呢 这下确实会等待一小会了由于我们设置的超时时间是15秒打印Log看看。 class com.bumptech.glide.load.HttpException: Failed to connect or obtain data, status code: -1 错误和上面一样但是超时时间是10秒 喂玩我是吧。那我改 Glide 的超时时间为 5000, 也就是5秒但是最终的结果还是10秒。 这是为什么呢虽然连上了WIFI但是没网还是无法解析hostname而 HttpURLConnection 内部定义的这一阶段的超时就是 10 秒。 我们可以把 Glide 的网络请求源码拷过来试试 class HttpTest {private final HttpUrlConnectionFactory connectionFactory new DefaultHttpUrlConnectionFactory();public HttpTest() {}public HttpURLConnection buildAndConfigureConnection(URL url, MapString, String headers) throws HttpException {HttpURLConnection urlConnection;try {urlConnection connectionFactory.build(url);} catch (IOException e) {throw new RuntimeException(URL.openConnection threw);}for (Map.EntryString, String headerEntry : headers.entrySet()) {urlConnection.addRequestProperty(headerEntry.getKey(), headerEntry.getValue());}urlConnection.setConnectTimeout(7000);urlConnection.setReadTimeout(7000);urlConnection.setUseCaches(false);urlConnection.setDoInput(true);urlConnection.setInstanceFollowRedirects(false);return urlConnection;}interface HttpUrlConnectionFactory {HttpURLConnection build(URL url) throws IOException;}private static class DefaultHttpUrlConnectionFactory implements HttpUrlConnectionFactory {DefaultHttpUrlConnectionFactory() {}Overridepublic HttpURLConnection build(URL url) throws IOException {return (HttpURLConnection) url.openConnection();}} }为了和之前的区别开我们设置7秒的超时看看结果有什么变化 java.net.UnknownHostException: Unable to resolve host “s3.ap-southeast-1.amazonaws.com”: No address associated with hostname 错误已经很明显了哎 1.1 HttpURLConnection 有网通了但是没访问权限 那我现在把网连上把授权关掉虽然能解析域名但是没有访问权限还是无法获取图片此时又会出现什么情况。 我们还是设置为15秒的超时 GlideApp.with(context!!).load(path).apply(options).timeout(15000).into(object : SimpleTargetDrawable() {override fun onLoadStarted(placeholder: Drawable?) {startMillis System.currentTimeMillis()YYLogUtils.w(开始加载$startMillis)super.onLoadStarted(placeholder)}override fun onLoadFailed(errorDrawable: Drawable?) {endMillis System.currentTimeMillis()YYLogUtils.w(Glide-onLoadFailed-Drawable,一共耗时:${endMillis - startMillis})super.onLoadFailed(errorDrawable)}override fun onResourceReady(resource: Drawable, transition: Transitionin Drawable?) {endMillis System.currentTimeMillis()YYLogUtils.w(Glide-onResourceReady-Drawable,一共耗时:${endMillis - startMillis})block(resource)}})出错的信息这次网络请求确实是通了确实是走到 timeout 里面了。 但是这个时间为什么是30秒 如果我们设置超时时间是20秒那么结果就是40秒 是 HttpURLConnection 的问题我们还是用上一步的 7秒超时的原生 HttpURLConnection 代码访问试试 可以看到结果是符合我们预期的7秒超时。 那为什么 Glide 默认的 HttpURLConnection 会是两倍的超时时间呢 是因为 Glide 内部对 HttpURLConnection 的请求做了重试处理。 当它第一次超时的时候会走到错误回调中但是并没有回调出去而是自己处理了一遍。 真的太迷了我自己不会学重试吗要你多管闲事… 1.1 换成 OkHttp3 如果摆脱这一套 HttpURLConnection 的逻辑与重试逻辑Glide 也提供了第三方网络请求的接口例如我们常用的用 OkHttp 来加载图片。 大家应该是不陌生的,加入依赖库即可 implementation com.github.bumptech.glide:okhttp3-integration:4.15.1此时已经换成OkHttp加载了它默认的超时时间就是10秒此时我们修改Glide的超时时间是无效的。 GlideApp.with(context!!).load(path).apply(options).timeout(20000) .into(object : SimpleTargetDrawable() {override fun onLoadStarted(placeholder: Drawable?) {startMillis System.currentTimeMillis()YYLogUtils.w(开始加载$startMillis)super.onLoadStarted(placeholder)}override fun onLoadFailed(errorDrawable: Drawable?) {endMillis System.currentTimeMillis()YYLogUtils.w(Glide-onLoadFailed-Drawable,一共耗时:${endMillis - startMillis})super.onLoadFailed(errorDrawable)}override fun onResourceReady(resource: Drawable, transition: Transitionin Drawable?) {endMillis System.currentTimeMillis()YYLogUtils.w(Glide-onResourceReady-Drawable,一共耗时:${endMillis - startMillis})block(resource)}})别说改成20秒改成100秒也无效因为这些配置是修改的默认的 HttpURLConnection 的超时时间的。OkHttp的加载根本就不走那一套了。 打印 Log 如下 哎真的是头都大了不是说好的开箱即用吗咋个这么多问题还分这么多情况真不知道该如何是好。 二、问题解决1使用 OkHttp3 的自定义 Client 既然我们使用 OkHttp 之后无法在 Glide 中修改超时时间那么我们直接修改 OkHttp 的超时时间可不不可以 大家或多或少都配置过这里直接贴代码 GlideModule public final class HttpGlideModule extends AppGlideModule {Overridepublic void registerComponents(Context context, Glide glide, Registry registry) {// 替换自定义的Glide网络加载registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(GlideOkHttpUtils.getHttpClient()));} }实现我们自己的 OkHttpClient 类 public class GlideOkHttpUtils {public static OkHttpClient getHttpClient() {OkHttpClient.Builder builder new OkHttpClient.Builder().connectTimeout(15, TimeUnit.SECONDS).addInterceptor(new LoggingInterceptor()) //打印请求日志可有可无.sslSocketFactory(getSSLSocketFactory()).hostnameVerifier(getHostnameVerifier());return builder.build();}/*** getSSLSocketFactory、getTrustManagers、getHostnameVerifier* 使OkHttpClient支持自签名证书避免Glide加载不了Https图片*/private static SSLSocketFactory getSSLSocketFactory() {try {SSLContext sslContext SSLContext.getInstance(SSL);sslContext.init(null, getTrustManagers(), new SecureRandom());return sslContext.getSocketFactory();} catch (Exception e) {throw new RuntimeException(e);}}private static TrustManager[] getTrustManagers() {return new TrustManager[]{new X509TrustManager() {Overridepublic void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}Overridepublic void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}Overridepublic X509Certificate[] getAcceptedIssuers() {return new X509Certificate[]{};}}};}private static HostnameVerifier getHostnameVerifier() {return new HostnameVerifier() {Overridepublic boolean verify(String hostname, SSLSession session) {return true;}};}}可以看到我们设置了15秒的超时打印的结果如下 想设置几秒就是几秒没有重试导致时间不对一说。这确实是一种方案。 三、问题解决2使用协程timeout 另一种方案就是使用协程的超时来控制由于 Glide 的加载图片与回调的处理是匿名函数实现的内部回调的处理我们先用协程处理铺平回调。 之前讲过这里直接上代码 suspend fun Any.downloadImageWithGlide(imgUrl: String): File {return suspendCancellableCoroutine { cancellableContinuation -GlideApp.with(commContext()).load(imgUrl).timeout(15000) //设不设都一样反正不靠你.diskCacheStrategy(DiskCacheStrategy.DATA).downloadOnly(object : SimpleTargetFile?() {override fun onResourceReady(resource: File, transition: Transitionin File??) {cancellableContinuation.resume(resource)}override fun onLoadFailed(errorDrawable: Drawable?) {super.onLoadFailed(errorDrawable)cancellableContinuation.resumeWithException(RuntimeException(加载失败了))}})} }使用起来我们就是协程的 timeout 函数不管底层是什么实现的直接上层的超时拦截。 launch{...try {val file withTimeout(15000) {downloadImageWithGlide(userInfo.avatarUrl)}YYLogUtils.e(注册人脸服务-图片加载成功${file.absolutePath})//下载成功之后赋值本地路径到对象中userInfo.avatarPath file.absolutePath//去注册人脸registerHotelMember(userInfo)} catch (e: TimeoutCancellationException) {YYLogUtils.e(注册人脸服务-图片加载超时${e.message})checkImageDownloadError(userInfo)} catch (e: Exception) {YYLogUtils.e(注册人脸服务-图片加载错误${e.message})checkImageDownloadError(userInfo)}}这也是比较方便的一种方案。 后记 如果是网络请求不管是接口的Http或者是Glide的图片加载我们可以使用OkHttp加载可以设置 OkHttpClient 的 Timeout 属性来设置超时。 如果是其他的异步操作我们也可以使用协程的 timeout 函数直接在上层超时取消协程也能达到目的。 两种方法都是可以的我个人是选择了协程 timeout 的方式因为我发现有些情况下就算设置 OkHttp 的超时偶尔还是会长时间超时。如网络连接较慢或不稳定如服务端没有及时响应或响应时间过长那么超时机制将无法起作用。所以为了保险起见还是使用协程 timeout 直接上层处理了更新之后目前运行状况良好。 Android 学习笔录 Android 性能优化篇https://qr18.cn/FVlo89 Android 车载篇https://qr18.cn/F05ZCM Android 逆向安全学习笔记https://qr18.cn/CQ5TcL Android Framework底层原理篇https://qr18.cn/AQpN4J Android 音视频篇https://qr18.cn/Ei3VPD Jetpack全家桶篇内含Composehttps://qr18.cn/A0gajp Kotlin 篇https://qr18.cn/CdjtAF Gradle 篇https://qr18.cn/DzrmMB OkHttp 源码解析笔记https://qr18.cn/Cw0pBD Flutter 篇https://qr18.cn/DIvKma Android 八大知识体https://qr18.cn/CyxarU Android 核心笔记https://qr21.cn/CaZQLo Android 往年面试题锦https://qr18.cn/CKV8OZ 2023年最新Android 面试题集https://qr18.cn/CgxrRy Android 车载开发岗位面试习题https://qr18.cn/FTlyCJ 音视频面试题锦https://qr18.cn/AcV6Ap
http://www.w-s-a.com/news/345112/

相关文章:

  • 做爰全过程的视频网站网络文化经营许可证怎么办
  • 常德市网站建设网站开发用哪个软件好
  • 网站文章怎么更新时间重庆勘察设计网
  • 外卖网站设计企业网站优化做法
  • 专业的营销型网站制作wordpress版权年份
  • 程序员会搭建非法网站吗怎么把wordpress字去掉
  • 牡丹江营商环境建设监督局网站中国档案网站建设的特点
  • 网站欣赏网站欣赏知名企业网站搭建
  • 书店网站建设可行性分析为大型企业设计网络营销方案
  • 北京教育云平台网站建设中国服装设计网站
  • 网络公司专业做网站豌豆荚app下载
  • 网站建设属于什么岗位济宁网站建设_云科网络
  • wordpress网站监测fwa 网站 欣赏
  • 用jsp做的可运行的网站推广网络
  • 电商网站设计论文wordpress子文件夹建站
  • 临沂网站优化如何如何做公司的网站建设
  • 建设部网站 光纤到户沈阳网页设计兼职
  • 企业网站建设作用宁波企业网站推广效果好
  • wordpress课件站模板做网站的公司 贵阳
  • 低价格网站建设网站建设中的板块名称
  • 青岛网站建设华夏h5链接是什么意思
  • 贸易公司如何做网站百度做的网站一般在什么后台
  • 东莞网站设计方案广州做服装电商拿货的网站
  • 部队网站建设设计dede个人网站模板
  • 个人网站怎么自己备案重庆怎样网站推广
  • 做电影网站挣钱吗重庆网站建设技术托管
  • 网站建设用户登录网站商业授权含义
  • 接做室内效果图的网站wordpress制作上传图片
  • 维护一个网站一年多少钱网站微信登录怎么做的
  • 中国建设银行网站E路护航官网如何在招聘网站上选个好公司做销售