赞
踩
安卓项目中加载网页使用腾讯的TBS,X5内核一直还好用,发现部分用户手机出现了偶尔闪退的情况。
研究后发现报错信息:
Using WebView from more than one process at once with the same data directory is not supported.
完整信息:
报错用户设备为9.0以上,原来是因为在Android Pie 的行为变更中,框架安全性变更中包含了 WebView 的行为变更。
- 为改善 Android 9 中的应用稳定性和数据完整性,应用无法再让多个进程共用同一 WebView 数据目录。
- 此类数据目录一般存储 Cookie、HTTP 缓存以及其他与网络浏览有关的持久性和临时性存储。
-
- 在大多数情况下,您的应用只应在一个进程中使用 android.webkit 软件包中的类,例如 WebView 和 CookieManager。
- 例如,您应该将所有使用 WebView 的 Activity 对象移入同一进程。
- 您可以通过在应用的其他进程中调用 disableWebView(),更严格地执行"仅限一个进程”规则。
- 该调用可防止 WebView 在这些其他进程中被错误地初始化,即使是从依赖内容库进行的调用也能防止。
-
- 如果您的应用必须在多个进程中使用 WebView 的实例,则必须先利用 WebView.setDataDirectorySuffix() 函数为每个进程指定唯一的数据目录后缀,然后再在该进程中使用 WebView 的给定实例。
- 该函数会将每个进程的网络数据放入其在应用数据目录内自己的目录中。
解决方式:
- public class WebApplication extends Application {
-
- private static final String PROCESS = "com.sunzn.core";
-
- @Override
- public void onCreate() {
- super.onCreate();
- initPieWebView();
- }
-
- private void initPieWebView() {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
- String processName = getProcessName(this);
- if (!PROCESS.equals(processName)) {
- WebView.setDataDirectorySuffix(getString(processName, "sunzn"));
- }
- }
- }
- public String getProcessName(Context context) {
- if (context == null) return null;
- ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
- for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
- if (processInfo.pid == android.os.Process.myPid()) {
- return processInfo.processName;
- }
- }
- return null;
- }
-
- public String getString(String s, String defValue) {
- return isEmpty(s) ? defValue : s;
- }
-
- public boolean isEmpty(String s) {
- return s == null || s.trim().length() == 0;
- }
-
- }
注:以上的方法,还没有解决我遇到的问题,真的心痛,可能是我设置Activity的启动模式,导致程序运行的进程不同。
最后先将targetSdkVersion设置为27,暂时解决问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。