2019独角兽企业重金招聘Python工程师标准>>>

添加WebChromeClient,复写onJsAlert、onJsConfirm、onJsPrompt方法后,弹框异常退出问题

项目经理说,Android没有处理弹框,点击按钮没有反应,iOS就可以。于是就复写了onJsAlert、onJsConfirm、onJsPrompt三个方法,来处理页面上的弹框。写完后满心喜悦的以为可以了,没想到项目经理说,点击按钮异常退出;然后自己查看日志:

08-06 10:41:53.023 29277-29339/com.medicine E/chromium: [ERROR:child_thread_impl.cc(762)] Request for unknown Channel-associated interface: ui::mojom::GpuMain
08-06 10:41:53.036 29277-29338/com.medicine E/libEGL: cache file failed CRC check

然并卵,这样的日志并不能查找出问题,还好红米手机有捕捉异常的功能,详细异常如下:

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'Xiaomi/hennessy/hennessy:5.0.2/LRX22G/V9.6.1.0.LHNCNFD:user/release-keys'
Revision: '0'
ABI: 'arm64'
pid: 27850, tid: 27850, name: medicine  >>> com.medicine <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Abort message: '[FATAL:jni_android.cc(243)] Please include Java exception stack in crash report
'x0   0000000000000000  x1   0000000000006cca  x2   0000000000000006  x3   0000007fae06a0f0x4   0000007fae06a0f0  x5   0000000000000005  x6   0000000000000001  x7   0000000000000020x8   0000000000000083  x9   0000007fd82d9043  x10  0000007fd82d8ff8  x11  0000000000000001x12  0000000000000001  x13  0000000000000054  x14  0000007f9d9dd7c8  x15  0000007fae035bc0x16  0000007fae02d7e0  x17  0000007fadff258c  x18  0000000000000000  x19  0000007fae06a0f0x20  0000007fae06a3a8  x21  0000007fae033000  x22  000000000000000b  x23  0000000000000006x24  0000007fd82d98f0  x25  0000007fd82d9ab8  x26  0000000061100021  x27  000000007a90001dx28  00000055bc8f0a60  x29  0000007fd82d9320  x30  0000007fadfaeb6csp   0000007fd82d9320  pc   0000007fadff2594  pstate 0000000060000000backtrace:#00 pc 0000000000061594  /system/lib64/libc.so (tgkill+8)#01 pc 000000000001db68  /system/lib64/libc.so (pthread_kill+160)#02 pc 000000000001f09c  /system/lib64/libc.so (raise+28)#03 pc 0000000000018abc  /system/lib64/libc.so (abort+60)#04 pc 0000000000771f20  /system/app/WebViewGoogle/lib/arm64/libwebviewchromium.so

虽然获取到了更多的信息,我还是想哭,还是没有一点用处,都是底层框架的错误信息,对于查找错误还是云里雾里,只好去排查代码。既然是复写onJsAlert、onJsConfirm、onJsPrompt三个方法后,报错就查看具体复写的代码,一下是复写代码详情:

@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {new AlertDialog.Builder(view.getContext()).setTitle("对话框").setMessage(message).setPositiveButton("确定", (dialog, which) -> {result.confirm();dialog.dismiss();}).setCancelable(false).show();return true;
}@Override
public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {new AlertDialog.Builder(view.getContext()).setTitle("对话框").setMessage(message).setPositiveButton("确定", ((dialog, i) -> {result.confirm();dialog.dismiss();})).setNegativeButton("取消", (dialogInterface, i) -> result.cancel()).setOnCancelListener(dialogInterface -> result.cancel()).show();return true;
}@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {final EditText et = new EditText(view.getContext());et.setSingleLine();et.setText(defaultValue);new AlertDialog.Builder(view.getContext()).setTitle("对话框").setMessage(message).setView(et).setPositiveButton("确定", ((dialog, i) -> {result.confirm(et.getText().toString());dialog.dismiss();})).setNegativeButton("取消", (dialogInterface, i) -> result.cancel()).setOnCancelListener(dialogInterface -> result.cancel()).show();return true;
}

查看代码的时候,发现new AlerDialog的时候用的是view.getContext(),然后发现new WebView()的时候用的是getApplicationContext();我们知道AlertDialog的Context只能是Activity,所以发现问题;把getApplicationContext()改为当前Activity后,问题就解决了。

移动端日历控件ICalendar.js在Android息屏后,不能选择时间,时间只能是当前时间

测试人员说,Android端在选择时间的时候失败,只可以选择当前时间。于是自己测试,第一次进入可以选择时间,没有问题;但是当锁屏后,再次进入页面后,可以弹出日期选择框,滚动日期的时候,明显发现日期滚动不顺畅,并且预期的时间并没有出现,而是默认的当前时间。

找到问题所在,然后查找问题根源在哪里:既然是在锁屏后出现问题,会不会是onPause()和onResume()方法里面的问题呢;心中有了这样的想法后就把onPause()和onResume()注释了,再次运行,发现日期选择正常了;如此看来,的确是onPause()和onResume()方法里面出现问题了。这两个方法是从网上找来的,具体代码如下:

@Override
protected void onResume() {super.onResume();if (mWebView != null) {mWebView.onResume();}
}@Override
protected void onPause() {super.onPause();if (mWebView != null) {mWebView.onPause();mWebView.pauseTimers();}
}

copy的代码也没有深究,但是发现有个方法没有成对出现mWebView.pauseTimers(),然后查看源代码,文档解释为:

Pauses all layout, parsing, and JavaScript timers for all WebViews. This is a global requests, not restricted to just this WebView. This can be useful if the application has been paused.

机器翻译为:暂停所有WebView的所有布局,解析和JavaScript计时器。此是全局请求,不仅限于此WebView。如果应用程序已暂停,这可能很有用。

然后再WebView源码中发现pauseTimers()方法下面就是resumeTimers()方法,喜出望外,文档解释为:

Resumes all layout, parsing, and JavaScript timers for all WebViews. This will resume dispatching all timers.

机器翻译为:恢复所有WebView的所有布局,解析和JavaScript计时器。 这将继续调度所有计时器。

于是,恢复注释的代码,在Activity的onResume()方法中加上mWebView.resumeTimers(),运行项目,发现问题解决。因此,具体问题是在Activity息屏后调用webview的pauseTimers()方法,把js功能暂停;但是在onResume()没有恢复运行,所以造成这个问题。

转载于:https://my.oschina.net/deepSprings/blog/1923103

关于Android H5混合开发遇到的问题相关推荐

  1. androidh5混合开发_Android H5混合开发(3):原生Android项目里嵌入Cordova

    前言 如果安卓项目已经存在了,那么如何使用Cordova做混合开发? 方案1(适用于插件会持续增加或变化的项目): 新建Cordova项目并添加Android平台,把我们的安卓项目导入Android平 ...

  2. 移动端H5混合开发设置复盘与总结

    此篇接上一篇: 移动端H5混合开发,Touch触控,拖拽,长按, 滑屏 实现方案 https://www.cnblogs.com/buoge/p/9346699.html app 场布设置已经上线了, ...

  3. ioswebview混编_iOS 原生和H5混合开发总结

    最近一段时间开发一个App,由于时间紧采用原生+H5混合开发,这里记录一下开发过程中遇到的问题. 之前在项目中使用过WebViewJavascriptBridge,使用起来很简单,但是这次项目中没有使 ...

  4. 混合开发与移动端--H5混合开发、H5页面的开发布局、开发注意事项、H5与原生(安卓)交互、webpack打包优化解决方案、H5调试工具、webview

    H5混合开发 混合开发.原生开发.H5开发的区别: 简述:主流APP:原生APP.H5(webapp).混合APP,相对应的定制研发即原生开发.H5开发.混合开发 原生APP开发优缺点: 可以访问手机 ...

  5. 招募技术合伙人(H5混合开发+秒开流应用)

    本司因技术开发的需要,特向社会.高校招募技术合伙人,希望不甘于工薪收入,有志创业的人士踊跃报名,无需投资.无需离开原单位. 要求:擅长H5混合开发,会秒开(流应用)的优先 邮箱:Mr.liao@ali ...

  6. Android封装sdk页面为h5,Android/H5混合 SDK 集成文档

    Android /H5 混合SDK 该SDK用于Android Hybrid 模式下,H5页面的以下情形: * 用户以app或单个设备为单位,进行H5页面的试验 * 离线缓存模式H5页面的试验 SDK ...

  7. H5混合开发二维码扫描教程之大圣众娱十人牛牛源码搭建架设

    今天用H5调用本地摄像头进行扫描二维码,我之前有做过原生安卓的二维码扫一扫,主要是通过调用zxing插件进行操作的,其中还弄了个闪光灯.但是纯H5的没接触过,心里没底,于是晚上回家开始网上各处找方案. ...

  8. Meetup 回顾 | 多场景下的 H5 混合开发与 Flutter 多平台应用开发

    9 月 7 日,RTC 开发者社区与北京 GDG 联合主办的「前端技术专场」在北京中关村圆满结束啦.周末北京的天气再热,也比不上社区小伙伴们的学习心气更热,现场 100 多位开发者在 3 位演讲人的分 ...

  9. 谈谈Android App混合开发

    推酷 文章 站点 主题 公开课 活动 客户端 荐 周刊 登录 谈谈Android App混合开发 时间 2015-08-25 20:13:43bxbxbai 原文  http://bxbxbai.gi ...

最新文章

  1. 2021年大数据常用语言Scala(二十):函数式编程 介绍
  2. 详细设计 英文_人体工程学设计:COMMA感应式无线充电器深度拆解
  3. rdesktop 登录腾讯云
  4. 学习Struts--Chap02:Struts2框架各个功能模块和程序执行流程的介绍
  5. 各种没有由来的问题,干!
  6. Redis中的Cluster总结
  7. python startswitch_使用python esl 实现FreeSWITCH自动外呼
  8. mysql mpm_使用Zabbix + MPM全面监控MySQL
  9. 串行 RapidIO
  10. 股价狂涨 500 亿,小米手机业务与造车可否兼得?
  11. 讯飞智能语音先锋者:等到人机交互与人类交流一样自然时,真正的智能时代就来了!...
  12. 互联网公司面试必问的mysql题目(上)
  13. 先河系统为你讲解私有云服务器的优点
  14. 月薪3万Java优秀简历模板
  15. 计算机教育应用研究,技术教育在计算机科学与技术师范专业中的应用研究
  16. 【VMware】XP安装VMware Tools
  17. html如何让字体变形,jquery实现字体变形特效-css字体变成圆形
  18. Codeforces1153——D. Serval and Rooted Tree(思维好题+dfs+贪心)
  19. Java-满天繁星案例(1)
  20. prometheus监控常用告警规则

热门文章

  1. javascript中有关this的使用
  2. 利用JS使用POST方式提交请求的方法
  3. 查看sqlserver被锁的表以及如何解锁
  4. 为云服务立规矩——首批可信云服务认证名单公布
  5. DivCSS网页布局中CSS无效的十个常见原因
  6. JQuery——选择器分类
  7. linux小脚本批量添加/删除用户
  8. Guava Cache缓存的移除与读取
  9. python学习 第七篇 sql优化
  10. 理清那么多个OO(面向对象)