gpt4 book ai didi

Android Pie (9.0) WebView 多进程

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:03:56 25 4
gpt4 key购买 nike

从 Android Pie (API 28) 开始,Google 不允许在 2 个不同的进程中使用单个 WebView 实例。

文档:https://developer.android.com/reference/android/webkit/WebView.html#setDataDirectorySuffix(java.lang.String)

根据需要,我调用了 WebView.setDataDirectorySuffix("dir_name_no_separator") 但不幸的是,我得到了一个异常。我试图在第二个进程服务 onCreate() 中调用此方法。

java.lang.RuntimeException: Unable to create service com.myapp.service.MyService: java.lang.IllegalStateException: Can't set data directory suffix: WebView already initialized
at android.app.ActivityThread.handleCreateService(ActivityThread.java:3544)
at android.app.ActivityThread.access$1300(ActivityThread.java:199)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1666)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.IllegalStateException: Can't set data directory suffix: WebView already initialized
at android.webkit.WebViewFactory.setDataDirectorySuffix(WebViewFactory.java:136)
at android.webkit.WebView.setDataDirectorySuffix(WebView.java:2165)
at com.myapp.service.MyService.onCreate(MyService.java:134)

我找不到该异常的任何原因。我没有调用此方法两次,也没有在我的主进程中调用它。有什么想法吗?

最佳答案

已解决。

我的项目托管 AdMob 广告,我在 ApplicationonCreate() 中调用 MobileAds.initialize() 方法。广告初始化程序加载一个 WebView,现在禁止在您调用 WebView.setDataDirectorySuffix("dir_name_no_separator") 方法之前在新进程中执行此操作。

当创建第二个进程时,它也经历相同的应用程序创建流程,这意味着它在 Application 类中调用相同的 onCreate(),它调用MobileAds.initialize() 尝试创建一个新的 WebView 实例并由此导致崩溃。

IllegalStateException: Can't set data directory suffix: WebView already initialized

我是如何解决这个问题的?

我使用以下方法获取进程名称并检查它是否是我的主进程 - 调用 MobileAds.initialize() 方法,如果它是我的第二个进程,则调用WebView.setDataDirectorySuffix("dir_name_no_separator") 方法。

获取进程名:

public static String getProcessName(Context context) {
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;
}

应用类 onCreate():

if (!Utils.getProcessName(this).equals("YOUR_SECOND_PROCESS_NAME")) {
MobileAds.initialize(this);
} else {
WebView.setDataDirectorySuffix("dir_name_no_separator")
}

关于Android Pie (9.0) WebView 多进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51843546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com