当前位置:   article > 正文

Android上多进程中使用webview的问题_android webview另开一个进程加载

android webview另开一个进程加载

在Andrid P以上的系统中,如果使用了多个进程,而且在这些进程中使用到了webview,那么你可能遇到下面的异常提示

java.lang.RuntimeException: Using WebView from more than one process at once with the same data directory is not supported. https://crbug.com/558377

  1. java.lang.RuntimeException: Using WebView from more than one process at once with the same data directory is not supported. https://crbug.com/558377
  2. at org.chromium.android_webview.AwBrowserProcess.b(PG:12)
  3. at n6.m(PG:33)
  4. at m6.run(PG:2)
  5. at org.chromium.base.task.TaskRunnerImpl.g(PG:11)
  6. at Nt.run(Unknown Source:2)
  7. at android.os.Handler.handleCallback(Handler.java:873)
  8. at android.os.Handler.dispatchMessage(Handler.java:99)
  9. at android.os.Looper.loop(Looper.java:207)
  10. at android.app.ActivityThread.main(ActivityThread.java:6878)
  11. at java.lang.reflect.Method.invoke(Native Method)
  12. at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
  13. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:876)

这个错误有可能导致app崩溃退出。

原因就是Android P以及之后版本不支持同时从多个进程使用具有相同数据目录的WebView

谷歌官方也是给了解决方法,就是给不同的进程中的webview设置不同的数据目录

在Applicationd类的onCreate或者onBaseContextAttached方法中加入

  1. public void onBaseContextAttached(Context base) {
  2. super.onBaseContextAttached(base);
  3. initWebViewDataDirectory(this);
  4. }
  5. /**
  6. * 得到进程名称
  7. * @param context
  8. * @return
  9. */
  10. public static String getProcessName(Context context) {
  11. try {
  12. if (context == null)
  13. return null;
  14. ActivityManager manager = (ActivityManager)
  15. context.getSystemService(Context.ACTIVITY_SERVICE);
  16. for (ActivityManager.RunningAppProcessInfo processInfo :
  17. manager.getRunningAppProcesses()) {
  18. if (processInfo.pid == android.os.Process.myPid()) {
  19. return processInfo.processName;
  20. }
  21. }
  22. } catch (Exception e) {
  23. e.printStackTrace();
  24. }
  25. return null;
  26. }
  27. /**
  28. * 为webView设置目录后缀
  29. * @param context
  30. */
  31. @RequiresApi(api = Build.VERSION_CODES.P)
  32. public static void initWebViewDataDirectory(Context context) {
  33. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
  34. String processName = getProcessName(context);
  35. if (!context.getPackageName().equals(processName)) {//判断是否是默认进程名称
  36. WebView.setDataDirectorySuffix(processName);
  37. }
  38. }
  39. }

写在最后,如果非必要,不要在多进程中使用webview,也尽量少修改webview的datadirectory,只在主进程初始化浏览器,否则高版本中多进程初始化webview会crash

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/375321
推荐阅读
相关标签
  

闽ICP备14008679号