当前位置: 首页 > news >正文

做汽车新闻哪个网站好网推项目平台

做汽车新闻哪个网站好,网推项目平台,网站开发脚本语言,大连企业建站系统JSAPI的技术原理图H5和Java通信H5要想和Java通信,Java需要通过WebView往H5里面注入一个JavaObj,之后JS就可以通过这个JavaObj对象其提供带JavascriptInterface注解的方法//注册js对象,名字叫nativeObj,可以在JS里面引用这个名字,来…
d25058b3eca6924390fad6044de54648.png

JSAPI的技术原理图

H5和Java通信

H5要想和Java通信,Java需要通过WebView往H5里面注入一个JavaObj,之后JS就可以通过这个JavaObj对象其提供带@JavascriptInterface注解的方法

//注册js对象,名字叫nativeObj,可以在JS里面引用这个名字,来调用JsBridge对象的带@JavascriptInterface注解的public方法mWebView.addJavascriptInterface(new JsBridge(this,mWebView),"nativeObj");JS代码示例

Java和H5通信

Java可以通过mWebView.loadUrl("javascript:handleMsgFromNative('" + json + "')")来执行JS函数,不过这个loadUrl()函数没法接收JS函数的返回值,如果我们想接收JS函数的返回值,我们可以使用

mWebView.evaluateJavascript("handleMsgFromNative('" + json + "')", new ValueCallback() {    @Override    public void onReceiveValue(String value) {        System.out.println("value="+value);    }});

Java和H5双向通信注意事项

H5调Java对象的方法,实际上Java对象的方法并不是运行在主线程中,而是运行在一个名叫JavaBridge的工作线程中,所以我们在开发JSAPI的时候,要注意线程间的切换。

Java调用H5里面的JS函数,必须要在主线程中调用,否则会出现错误。

JsBridge类

在JSAPI模块开发过程中,我们一般不会为每一个JSAPI都提供一个java类方法,通常我们会采用桥接模式对这个接口进行封装,让我们的具体JSAPI的开发更加灵活方便,下面是我写的一个简单的JsBridge封装类,大家可以参考一下

/** * js和native双向通信的bridge类 * author: kgdwbb * date:2020-04-18 */public class JsBridge {    private Activity mActivity;    private WebView mWebView;    public JsBridge(Activity activity,WebView webView) {        mActivity=activity;        mWebView = webView;    }    @JavascriptInterface    public void helloJava(String msg) {        System.out.println(msg);    }    @JavascriptInterface    public void handleMsgFromJs(String json) {        String tname = Thread.currentThread().getName();        //注意:js调native的方法,不是运行在主线程,而是运行在JavaBridge线程        System.out.println("tname="+tname);        RequestModel model = JSONObject.parseObject(json,RequestModel.class);        JsCallback jsCallback = new JsCallback(mActivity,mWebView);        //注意:这里是一些示例代码,涉及到具体的业务,大家可以在这个基础上继续封装        if ("hello".equals(model.name)) {            //取出js传递给native的content参数            String content = model.params.get("content").toString();            //把content数据输出,这只是示例,大家可以根据业务需要,进行相应的处理            System.out.println("content=" + content);            ArrayMap resultMap=new ArrayMap<>();            resultMap.put("content","hello js");            //jsapi业务处理完成后,把对应的处理结果返回给js            sendCallback(jsCallback,model.callbackId,0,"",resultMap);        } else {            sendCallback(jsCallback,model.callbackId,-1,"jsapi not exist",null);        }    }    /**     * 把natvie的处理结果返回给js     * @param jsCallback jsCallback对象     * @param callbackId js传给native的callbackId     * @param errCode 错误码     * @param errMsg 错误信息     * @param resultMap native返回给js的结果     */    private void sendCallback(JsCallback jsCallback, String callbackId, int errCode, String errMsg, ArrayMap resultMap) {        ResultModel result = new ResultModel(errCode, errMsg);        result.result = resultMap;        ResponseModel response = new ResponseModel();        response.callbackId = callbackId;        response.response = result;        jsCallback.callback(response);    }    public static class RequestModel {        /**         * jsapi的名字         */        public String name;        /**         * JS动态生成的全局唯一的callback id,Native通过这个callbackId异步的把JS调用Native的返回结果返回给JS         */        public String callbackId;        /**         * jsapi的参数         */        public ArrayMap params;    }    public static class ResponseModel {        /**         * JS动态生成的全局唯一的callback id,Native通过这个callbackId异步的把JS调用Native的返回结果返回给JS         */        public String callbackId;        /**         * jsapi的返回值包装类         */        public ResultModel response;    }    public static class ResultModel {        public ResultModel(int errCode, String errMsg) {            this.errCode = errCode;            this.errMsg = errMsg;        }        /**         * 错误码         */        public int errCode;        /**         * 错误信息         */        public String errMsg;        /**         * jsapi调用成功的返回值         */        public ArrayMap result;    }    public static class JsCallback {        private WeakReference mActivity;        private WeakReference mWebView;        public JsCallback(Activity activity,WebView webView) {            mActivity = new WeakReference<>(activity);            mWebView = new WeakReference<>(webView);        }        /**         * native把jsapi的返回值返回给js         *         * @param model         */        public void callback(final ResponseModel model) {            if (mWebView.get() != null) {                //注意:这里一定要做线程上下文切换,因为当前线程是JavaBridge线程,不是主线程,webview必须在主线程中才能调JS函数                mActivity.get().runOnUiThread(new Runnable() {                    @Override                    public void run() {                        String json = JSONObject.toJSONString(model);                        mWebView.get().loadUrl("javascript:handleMsgFromNative('" + json + "')");                    }                });            }        }    }}
http://www.lbrq.cn/news/2628649.html

相关文章:

  • 旅游门户网站源码怎么做的软文优化
  • 公司网站建设设计软文写手接单平台
  • 广告网站设计公司 作用外贸推广平台排名
  • 做投资的网站久久seo综合查询
  • 焦作市建设银行网站谷歌收录查询工具
  • 平顶山河南网站建设简述什么是网络营销
  • 广州上宏网站建设如何建立网站
  • 电话网络营销是什么上海高玩seo
  • 网络规划与设计需求分析学seo需要多久
  • bootstrap风格网站seo最新
  • 做网站图片太大好吗seo的定义
  • 便捷的大连网站建设123网址之家
  • 最新永久4虎最新人口谷歌优化技巧
  • 17做网站广州起做网店让百度收录自己的网站
  • 沧州网站建设推广凡科网站建站教程
  • 外贸soho怎么建网站二十条优化
  • 手机上怎么制作网站吗windows优化大师会员兑换码
  • 网站怎么做劫持老域名购买
  • 万网注册域名的步骤深圳网站搜索优化工具
  • 怎么在.Net中做团购网站北京做的好的seo公司
  • 北京网站建设手机app电子商务女装标题优化关键词
  • 深圳网页开发快速排名优化
  • 有谁有做卫生纸巾的网站东莞seo关键词排名优化排名
  • 56网站可以做电子相册贴吧推广400一个月
  • 万众城网站建设成都百度推广公司联系电话
  • 网站公安备案 查询百度知道合伙人官网登录入口
  • 怎么给网站做关键词足球进球排行榜
  • 怎么做网站解析什么平台发广告最有效
  • 湖南网站建设seo优化怎么做百度推广平台
  • 做公司网站怎么做手机版西安快速排名优化
  • 接入小甲鱼数字人API教程【详解】
  • 浅析 Berachain v2 ,对原有 PoL 机制进行了哪些升级?
  • “物联网+职业本科”:VR虚拟仿真实训室的发展前景
  • 首个!3D空间推理框架3D-R1:融合强化学习、推理链、动态视角,实现7大任务SOTA!
  • AI巨模型对决2025:五强争霸,谁能称王?
  • 012 网络—基础篇