莱芜网站建设优化国内一家做国外酒店团购的网站

news/2025/9/23 15:27:47/文章来源:
莱芜网站建设优化,国内一家做国外酒店团购的网站,网站怎么建设?,做网站百度百科关于作者#xff1a;CSDN内容合伙人、技术专家#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 #xff0c;擅长java后端、移动开发、商业变现、人工智能等#xff0c;希望大家多多支持。 未经允许不得转载 目录 一、导读二、概览三、问题过程源码追踪… 关于作者CSDN内容合伙人、技术专家 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 擅长java后端、移动开发、商业变现、人工智能等希望大家多多支持。 未经允许不得转载 目录 一、导读二、概览三、问题过程源码追踪 四、 推荐阅读 一、导读 我们继续总结学习遇到的问题温故知新。 今天遇到一个线上问题启动就闪退比较坑在此做一个记录防止掉坑。 本文记录一次bug解决的过程 Using WebView from more than one process 二、概览 今天将 targetSdkVersion 的版升级到了29出现了一些奇怪的报错日志如下 Fatal Exception: java.lang.RuntimeException: Using WebView from more than one process at once with the same data directory is not supported. https://crbug.com/558377 : Current process com.xx.xxapp(pid 13862), lock owner com.xx.xx.xxAPP (pid 13559)at org.chromium.android_webview.AwDataDirLock.b(AwDataDirLock.java:27)at as0.i(as0.java:30)at Zr0.run(Zr0.java:2)at android.os.Handler.handleCallback(Handler.java:883)at android.os.Handler.dispatchMessage(Handler.java:100)at android.os.Looper.loop(Looper.java:224)at android.app.ActivityThread.main(ActivityThread.java:7520)at java.lang.reflect.Method.invoke(Method.java)at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950) 三、问题过程 我们查看文档发现 google 文档 在android 9.0系统上如果多个进程使用WebView需要使用官方提供的api在子进程中给webview的数据文件夹设置后缀 如果不设置则会报错不过这个影响范围有限影响范围 Android 9及以上 且targetSdkVersion 28 Starting Android Pie (API 28), Google isnt allowing using a single WebView instance in 2 different processes.WebView.setDataDirectorySuffix(suffix);官方提供方案 protected void attachBaseContext(Context base) {mApplicationContext base;webViewSetPath(this);} public void webViewSetPath(Context context) {if (Build.VERSION.SDK_INT Build.VERSION_CODES.P) {String processName SpecialUtils.getCurProcessName(context);// 根据进程名称设置多个目录if(!CommonConstant.NEW_PACKAGE_NAME.equals(processName)){WebView.setDataDirectorySuffix(getString(processName,这里隐藏名字自己设置个目录));}} }public String getString(String processName, String defValue) {return TextUtils.isEmpty(processName) ? defValue : processName; }通过使用官方提供的方法后实际在项目中运用 application中设置多个存储目录虽然能减少问题发生的次数但从bugly后台依然能收到此问题的大量崩溃信 源码追踪 那么这个问题发生的原因究竟是什么一起来分析下抛出这个异常的逻辑吧 https://chromium.googlesource.com/chromium/src//refs/heads/main/android_webview/java/src/org/chromium/android_webview/AwDataDirLock.java#126 从源码分析调用链最终调用到了AwDataDirLock类中的lock方法 abstract class AwDataDirLock {static void lock(final Context appContext) {try (ScopedSysTraceEvent e1 ScopedSysTraceEvent.scoped(AwDataDirLock.lock);StrictModeContext ignored StrictModeContext.allowDiskWrites()) {if (sExclusiveFileLock ! null) {我们已经调用了lock并在此过程中成功获取了锁return;}如果我们已经调用了lock但没有成功获得锁则可能应用程序捕获到异常进行自动重启。if (sLockFile null) {String dataPath PathUtils.getDataDirectory();File lockFile new File(dataPath, EXCLUSIVE_LOCK_FILE);try {// Note that the file is kept open intentionally.sLockFile new RandomAccessFile(lockFile, rw);} catch (IOException e) {throw new RuntimeException(Failed to create lock file lockFile, e);}}对webview数据目录中的webview_data.lock文件在for循环中尝试加锁16次for (int attempts 1; attempts LOCK_RETRIES; attempts) {try {sExclusiveFileLock sLockFile.getChannel().tryLock();} catch (IOException e) {}如果加锁成功会将该进程id和进程名写入到文件if (sExclusiveFileLock ! null) {writeCurrentProcessInfo(sLockFile);return;}if (attempts LOCK_RETRIES) break;try {Thread.sleep(LOCK_SLEEP_MS);} catch (InterruptedException e) {}}如果加锁失败则会抛出异常// Using WebView from more than one process String error getLockFailureReason(sLockFile);boolean dieOnFailure Build.VERSION.SDK_INT Build.VERSION_CODES.P appContext.getApplicationInfo().targetSdkVersion Build.VERSION_CODES.P;if (dieOnFailure) {throw new RuntimeException(error);} else {}}} }分析了原因我们来看看解决思路我们可以在应用启动时对该文件尝试加锁如果加锁失败就删除该文件并重新创建加锁成功就立即释放锁这样当系统尝试加锁时理论上是可以加锁成功的。 通过检查目标目录的文件锁如果能够获得到锁就表明无异常如果获取不到文件锁再次重新设置存储目录。 public class WebViewUtil {public static void handleWebViewDir(Context context) {if (Build.VERSION.SDK_INT Build.VERSION_CODES.P) {return;}try {String suffix ;String processName getCurProcessName(context);if (!TextUtils.equals(context.getPackageName(), processName)) {//判断不等于默认进程名称suffix TextUtils.isEmpty(processName) ? context.getPackageName() : processName;WebView.setDataDirectorySuffix(suffix);suffix _ suffix;}tryLockOrRecreateFile(context,suffix);} catch (Exception e) {e.printStackTrace();}}TargetApi(Build.VERSION_CODES.P)private static void tryLockOrRecreateFile(Context context, String suffix) {String sb context.getDataDir().getAbsolutePath() /app_webviewsuffix/webview_data.lock;File file new File(sb);if (file.exists()) {try {FileLock tryLock new RandomAccessFile(file, rw).getChannel().tryLock();if (tryLock ! null) {tryLock.close();} else {createFile(file, file.delete());}} catch (Exception e) {e.printStackTrace();boolean deleted false;if (file.exists()) {deleted file.delete();}createFile(file, deleted);}}}private static void createFile(File file, boolean deleted){try {if (deleted !file.exists()) {file.createNewFile();}} catch (Exception e) {e.printStackTrace();}}public static String getCurProcessName(Context context) {int pid android.os.Process.myPid();ActivityManager activityManager (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);ListActivityManager.RunningAppProcessInfo appProcesses activityManager.getRunningAppProcesses();if (appProcesses null) {return null;}for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {if (appProcess null) {continue;}if (appProcess.pid pid) {return appProcess.processName;}}return null;}}但是这样上线后发现还有问题原因是不同机型目录可能不一样 我们自己使用debug包查看webview数据目录发现系统默认添加了进程名后缀这是由于用户更新了手机系统导致 使用华为mate20X测试调用 WebView.selDataDirecloySufx 自定义后缀已不生效会默认强制指定后缀为进程名 另外还发现部分华为手机直接将webview目录名app webview改为了app hws webview。 综上所述我们需要针对不同手机系统遍历可能的文件路径最新解决代码如下: javapublic static void handleWebViewDir(Context context) {if (Build.VERSION.SDK_INT Build.VERSION_CODES.P) {return;}String webViewDir /app_webview;String huaweiWebViewDir /app_hws_webview;String lockFile /webview_data.lock;try {xxx} catch (Exception e) {e.printStackTrace();}}TargetApi(Build.VERSION_CODES.P)private static void tryLockOrRecreateFile(String path) {File file new File(path);if (file.exists()) {try {FileLock tryLock (new RandomAccessFile(file, rw)).getChannel().tryLock();if (tryLock ! null) {tryLock.close();} else {createFile(file, file.delete());}} catch (Exception e) {boolean deleted false;if (file.exists()) {deleted file.delete();}createFile(file, deleted);}}}private static void createFile(File file, boolean deleted) {try {if (deleted !file.exists()) {boolean var2 file.createNewFile();}} catch (Exception e) {e.printStackTrace();}}然后在application的oncreate方法中调用 handleWebViewDir(); 参考文章 文章 1 文章 2 文章 3 四、 推荐阅读 Java 专栏 SQL 专栏 数据结构与算法 Android学习专栏 未经允许不得转载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/912986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站怎样做wap端医院网站建设方案计划

步骤 1、编写32位控制台程序2、实现字符串传参3、封装Process类库4、获取进程调用的返回值 在实际的项目中经常使用一些第三方C/C库,于历史原因,有的C库是32位的,由于没有源代码,所以一般很难修改为64位的类库,但又需要…

购买网站建设合同协议模板网络推广营销策划方案

SaaS近几年在国内逐渐升温,很多企业管理者都开始了解SaaS是什么意思,SaaS是企业根据需要,从SaaS提供商获取软件使用权的,直接通过互联网就可进行操作。对于我国大多数中小企业来说,选择SaaS模式的crm客户管理系统也许是…

Spring IO工具类及其用法

Spring IO工具类及其用法Spring IO 工具类FileCopyUtils 用于文件和流之间的复制操作,提供了多种重载方法。import org.springframework.util.FileCopyUtils; import java.io.File; import java.io.FileInputStream; …

Typora+Cnblog实现Markdown图片自动上传

作者:SkyXZ CSDN:SkyXZ~-CSDN博客 博客园:SkyXZ - 博客园 相信很多同学在使用Typora写MarkDown文档的时候都会发现我们复制进文档的图片都是本地路径,这也意味着但我们将写的文档分享给别人的时候别人是看…

Moka人力资源管理系统入选 NextGen Tech30 榜单

Moka人力资源管理系统入选 NextGen Tech30 榜单「在当下这个全新的商业周期中,真正改变游戏规则的公司,不再只是“出海”,而是自成立之初就为全球而生」——NextGen Tech302025 年 9 月,新加坡见证亚洲创新力量的集…

嵌套粒子群优化(Nested PSO)的电力系统经济调度方案

一、问题建模与算法设计 1.1 多目标优化模型 目标函数:经济目标:最小化总发电成本(含阀点效应) 环境目标:最小化污染物排放与爬坡惩罚约束条件:功率平衡:\(∑i=1NPi,t=Pload,t+Ploss,t\) 机组出力限制:\(Pi,mi…

淮安哪个做网站好点1_ 掌握网站开发的基本流程 要求:熟悉网站开发与设计的基本流程.

前言简单来说,数据库事务就是保证一组数据操作要么全部成功,要么全部失败。在 MySQL 中,事务是在引擎层实现的。原生的 MyISAM 引擎不支持事务,也是为什么 InnoDB 会取代它的重要原因之一。隔离性与隔离级别当数据库上有多个事务同…

仿站酷网站模板航空公司官网

一、简介 1、一款由Piriform开发的免费文件恢复工具,它能够帮助用户恢复那些不小心从电脑上删除的文件,包括从回收站清空的文件,以及因用户错误操作而从存储设备中删除的图片、音乐、文档等多种格式的文件。Recuva支持对硬盘、闪存卡、U盘等多种存储介质进行扫描与恢复,并且…

hk网站域名网站建设 书

CSDNpdf电子准考证查询下载系统(实证效果可照片)V1.0 使用场景: 教育机构比如学校用pdf准考证查询下载系统(实证效果可照片,最适合准考证打印); 也可自定义图片及坐标用于各种优秀党员三好学生等荣誉证书、聘书授权代理pdf电子证书查询与下载。 推荐Linux PHP5.5-7.3使用使…

游戏网站服务器租用网站正在建设中提示页面

By Lthis 上个月就想写了,一直没时间...网上大概搜了一下,原理与操作倒是一大堆,一直没看到源码实现,总得有人动手,这回轮到我了。东西写得很烂,请大牛勿喷。一直觉得靠源码的方式驱动学习是非常好的一种学…

山南网站建设做网站需要什么费用

文章目录 Linux Shell脚本文件vim编辑器vi的使用 认识Bash变量环境变量用户操作变量delcare与typeset 命令的别名与历史命名 正则表达式Shell ScriptsShell Scripts良好习惯第一个shell其他shell例子 - 来自鸟哥linux私房菜语法介绍shell 的调试 Linux Shell脚本文件 vim编辑器…

网站建设河北石家庄学做烤制食品的网站

【精选】Kafka、RocketMQ、RabbitMQ的比较总结_kafka rabbitmq rocketmq_【江湖】三津的博客-CSDN博客

怎么自己做网站模板整站seo排名外包

智慧医院3D人体导诊系统源码 开发语言:java 开发工具:IDEA 前端框架:Uniapp 后端框架:springboot 数 据 库:mysql 移 动 端:微信小程序、H5 “智慧导诊”以人工智能手段为依托,为人们提供智能分诊、问病信息等服务,在一定程度上满足了人们自我健康管理、精准挂号…

实用指南:C++编程学习(第34天)

实用指南:C++编程学习(第34天)2025-09-23 15:14 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !impor…

Java集合 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

用前端(HTML+Node.js)实现物品借用登记:完整代码示例

在日常工作中,经常需要借用各种办公或实验设备、工具及耗材。为了方便管理借用记录、防止物品丢失,同时提高办公效率,我设计了一个前端小程序——物品借用登记系统。该系统支持记录借用人、物品名称、数量、借用说明…

Google智能体Jules小试牛刀

Google智能体Jules小试牛刀Jules 能做什么Google 的 Jules 是一个编程相关的 AI 助手(coding agent),它可以在背景中异步地处理各种代码任务,让开发者腾出时间专注于更重要/更有创意的工作。 处理各种编码任务 Ju…

免费浏览的网站完全静态化成wordpress

一、Ken Burns特效 当使用OpenCV时,最常使用的是图像,但是我们也可以多个图像创建动画,通过引入时间轴更容易可视化。 Ken Burns特效这是一种以电影制片人肯伯恩斯 (Ken Burns) 命名的平移和缩放技术,Ken Burns 效果不是在屏幕上显示大型静态照片,而是裁剪细节,然后平移图…

泰安网站制作哪家好wordpress 建站教程

日志记录是软件开发中不可或缺的功能,它能帮助开发者在应用程序运行时记录重要信息,便于调试和监控。本文将详细介绍C#中的常用日志记录功能以及常用的日志库,包括日志级别控制、日志输出格式、自定义日志目标、结构化日志和异步日志记录。同…

深圳网站设计公司哪家好境外注册网站

根据现实需要,此系统我们设计出一下功能,主要有以下功能模板。 (1)新闻发布系统前台:首页、时事新闻、公告资讯、个人中心。 (2)管理员功能:首页、个人中心、用户管理、新闻分类管理…