分享

JsBridge最详细的解析,高版本webview的evaluateJavascript

 quasiceo 2018-09-28
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013766357/article/details/52541971

第一次发博客,肯定会有很多问题,还有技术交流方面,我不太会使用专业名词,我会用最通俗的方式来阐明我的观点,一般会把我思路画在图上,如果有用词欠妥的地方希望大家见谅。希望大家多多指正,互帮互助,共同进步。谢谢。

上周公司业务需要,要做android和H5的交互,并且在sdk19以上Native调用js使用webviewde.evaluateJavascript()实现,这可让我头疼,都不知道在jsbridge的什么地方加。以前我也没做过这种,然后加班加点网上各种找,但没有现成的,只能通过自己先弄懂jsbridge的源码才能在其基础上改进。以下就是我的结果。一定要仔细看图,内容都在图里。

本文基于github上android和javascript最流行的交互方式jsbridge,可能很多同学都已经看过了,但是大都数应该马马虎虎,让他说下jsbridge也许会说出个123,但让他说456,就不太清楚了。本文让大家懂得456,并在其基础上添加API19以上Native调用js的方法。当然再深层次的789,大家根据自行需要或兴趣去探索吧。

交互就得互相交流,先说说android调用javascript的方式:

 根据这几天的了解,android调用javascirpt的方法采用loadurl(javacriptCmd),这种方式的弊端就是没又返回值,得通过js改变iframe.src把结果返回,这样执行效率较低。sdk19以上采用evaluateJavascript方法,在回调方法里又返回值,效率优于前一种,毕竟当前android 4.4还是有少量的用户的。为了兼顾所有用户和执行效率问题,采用两种方式混合使用。android 4.4以下,请看下图:


android 4.4以上请看下图:


  1. <span style="font-size:14px;">public void callHandler(String handlerName, String data,final CallBackFunction callBack) {
  2. if(Build.VERSION.SDK_INT<Build.VERSION_CODES.KITKAT){
  3. //4.4以下
  4. Log.i(TAG,"4.4以下版本,dosend被调用");
  5. doSend(handlerName, data, callBack);
  6. }else{
  7. //4.4以上,包括4.4
  8. Log.i(TAG,"4.4以上版本,使用evaluateJavascript方法调js");
  9. String jscmd = String.format(BridgeUtil.HIGH_VERSION_CALL_JS,handlerName,data);
  10. if (Thread.currentThread() == Looper.getMainLooper().getThread()) {
  11. this.evaluateJavascript(jscmd, new ValueCallback<String>() {
  12. @Override
  13. public void onReceiveValue(String value) {
  14. callBack.onCallBack(value);
  15. }
  16. });
  17. }


  18. }

  19. }</span>


在webviewjavascirptbridge.js中添加19以上需要被andorid调用的方法

  1. function getHandlerAndHandle(handlerName, data) {
  2. // var responseCallback = function (reponseToNative) {
  3. // return reponseToNative;
  4. // }
  5. var responseDataH;
  6. console.log("js中getHandlerAndHandle被调用");
  7. var handler1 = WebViewJavascriptBridge._messageHandler;
  8. if (handlerName) {
  9. handler1 = messageHandlers[handlerName];
  10. }
  11. //查找指定handler
  12. try {
  13. handler1(data, function (reponseToNative) {
  14. responseDataH = reponseToNative;
  15. console.log(reponseToNative);
  16. return reponseToNative;
  17. });
  18. return responseDataH;
  19. }
  20. catch (exception) {
  21. if (typeof console != 'undefined') {
  22. console.log("WebViewJavascriptBridge: WARNING: javascript handler threw.", data, exception);
  23. }

  24. }

  25. }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多