AgentWeb 安卓x包4.1版本

  • 1)、JAVA调用JS(数据都是虚拟生成的哦)
    • 1.搭建实体类
    • 2.准备数据源
    • 3.定义JS函数
    • 4.JAVA调用JS
    • 5.Echarts数据解析处理
    • 6.效果展示
  • 2)、JS调用JAVA
    • 1.定义需要调用的接口
    • 2.web端 JS调用JAVA
    • 3.JAVA添加JS关联
    • 4.结果展示
  • 3)、踩坑说明
    • 项目场景:
      • 问题描述:
      • 原因分析:
      • 尝试解决:

A)、依赖:

        implementation 'com.just.agentweb:agentweb-androidx:4.1.4'implementation 'com.just.agentweb:filechooser-androidx:4.1.4'implementation 'com.download.library:downloader-androidx:4.1.4'

B)、基本用法:

 @BindView(R.id.wb_orl)ConstraintLayout wbOrl;...AgentWeb.with(WbActivity.this).setAgentWebParent(wbOrl, new ConstraintLayout.LayoutParams(-1, -1)) //-1是指父布局.useDefaultIndicator() //默认进度条 可带颜色 例如 0xffffff.createAgentWeb().ready().go("file:///android_asset/agent.html"); //本地html文件

1)、JAVA调用JS(数据都是虚拟生成的哦)

1.搭建实体类
public class WebAgentBean {private int id; private String desc; //描述private List<String> tagNames; //标签名字private int[] topTemp; //最高气温private int[] minTemp; //最低气温}
2.准备数据源
 public String webAgentBeanToJsonString() {WebAgentBean webAgentBean = new WebAgentBean();webAgentBean.setId(101);webAgentBean.setDesc("AgentWeb 中实现JAVA与JS互调");List<String> weekList = new ArrayList<>();for (int position = 0; position < 7; position++) {weekList.add("星期" + (position + 1));}webAgentBean.setTagNames(weekList);int[] topTemp = new int[7];for (int i = 0; i < 7; i++) {topTemp[i] = (int) (Math.random() * 10 + 1);}webAgentBean.setTopTemp(topTemp);int[] minTemp = new int[7];Random random = new Random();float flag = 0f; //定义标志for (int i = 0; i < 7; i++) {flag = random.nextFloat();minTemp[i] = flag > 0.5 ? (int) (Math.random() * 10) : (int) (Math.random() * (-10));//[-10,10]区间}// 因为是模拟数据随机性比较大 ,所以进行数据处理 , 最小值不能比最大值大 for (int i = 0; i < minTemp.length; i++) {if (minTemp[i] > topTemp[i]) {minTemp[i] = topTemp[i] - 1;}}webAgentBean.setMinTemp(minTemp);String jsonBean = new Gson().toJson(webAgentBean);return jsonBean;}
3.定义JS函数
    <script type="text/javascript">
//接受参数对象function loadWithAndroid(obj){...}</script>
4.JAVA调用JS
 AgentWeb agentWeb = AgentWeb.with(WbActivity.this).setAgentWebParent(wbOrl, new ConstraintLayout.LayoutParams(-1, -1)).useDefaultIndicator().createAgentWeb().ready().go("file:///android_asset/agent.html");String jsonBean = webAgentBeanToJsonString();System.out.println(jsonBean);agentWeb.getJsAccessEntrace().quickCallJs("loadWithAndroid", jsonBean);

//jsonBean数据打印如下
"desc":"WebAgent 中实现JAVA与JS互调","id":101,"minTemp":[-5,4,5,0,6,3,-2],"tagNames":["星期1","星期2","星期3","星期4","星期5","星期6","星期7"],"topTemp":[9,5,7,7,10,4,8]}

补充:quickCallJs方法传入字符串参数(可传入多个参数)如下方重载方法

public interface QuickCallJs {@RequiresApi(Build.VERSION_CODES.KITKAT)void quickCallJs(String method, ValueCallback<String> callback, String... params);void quickCallJs(String method, String... params);void quickCallJs(String method);
}
5.Echarts数据解析处理
 function loadWithAndroid(obj){var myChart = echarts.init(document.getElementById('main')); //用来展示图标的divvar min_tmp = -1; //最小值var xAxisIndex = -1; //x轴坐标obj.minTemp.forEach(function(item,index){console.log(index+" min----->"+item)if(min_tmp == -1)min_tmp = item;if(item <= min_tmp){min_tmp = item;xAxisIndex = index;}})//遍历日期obj.tagNames.map(function (param,index) {console.log(param + "---->" + index)})
// 指定图表的配置项和数据
var option = {...xAxis: {type: 'category',boundaryGap: false,data: obj.tagNames <!-- 日期格式 -->},yAxis: {type: 'value',axisLabel: {formatter: '{value} °C' <!-- 规划格式 -->}},series: [{name: '最高气温',type: 'line',data: obj.topTemp, <!-- 展示最高气温 -->,{name: '最低气温',type: 'line',data: obj.minTemp, <!-- 展示最低气温 -->...}]
};myChart.setOption(option);};
6.效果展示


柱状图展示:


柱状线性图展示:


2)、JS调用JAVA

1.定义需要调用的接口
     public class AgentWebInteface {@JavascriptInterface //一定要加public void complateWithJs(String str) {Toast.makeText(WbActivity.this, "JS调用JAVA完成" + str, Toast.LENGTH_SHORT).show();}}
2.web端 JS调用JAVA
function loadWithAndroid(obj){window.android.complateWithJs("我是web应用端发送的数据"); ...}
3.JAVA添加JS关联
agentWeb.getJsInterfaceHolder().addJavaObject("android", new AgentWebInteface());
4.结果展示

3)、踩坑说明

项目场景:

在进入Activity中直接调用JS


问题描述:

小编在进入Activity的时候直接调用了JS函数,但是此时是没有任何效果的,小编也在函数里面输出了语句,并且有个坑就是控制台并不会打印任何信息,而且还输出了一段乱码:

 function loadWithAndroid(obj){console.log("我进来了哦~")
}

输出如下乱码:

E/eglCodecCommon: glUtilsParamSize: unknow param 0x000085b5glUtilsParamSize: unknow param 0x000085b5D/eglCodecCommon: setVertexArrayObject: set vao to 0 (0) 0 0D/eglCodecCommon: setVertexArrayObject: set vao to 0 (0) 0 0D/eglCodecCommon: setVertexArrayObject: set vao to 2 (2) 0 0D/eglCodecCommon: setVertexArrayObject: set vao to 1 (1) 0 0D/eglCodecCommon: setVertexArrayObject: set vao to 3 (3) 0 0D/eglCodecCommon: setVertexArrayObject: set vao to 1 (1) 5 0E/eglCodecCommon: glUtilsParamSize: unknow param 0x000085b5glUtilsParamSize: unknow param 0x000085b5D/eglCodecCommon: setVertexArrayObject: set vao to 0 (0) 0 0setVertexArrayObject: set vao to 0 (0) 0 0

原因分析:
1.方法名称有误
可能是在JAVA调用JS时,将JS函数名称写错了。
2.WEB端未完全渲染
小编猜测是因为加载WEB端的时候,WEB端还没有来得及完全 渲染 完毕,但是在JAVA中就已经被调用了,所以可能导致函数无法被调用的情况

尝试解决:
1)、小编尝试不通过JAVA调用JS方式(agentWeb.getJsAccessEntrace().quickCallJs(Method)), 直接加载Html文件。
结果:无法正常加载
2)、小编尝试通过点击事件触发JAVA调用JS事件
结果:可以正常调用
3)、疑问?
如果说不能让其自动加载,那每次都需要通过我们自己去调用函数,那这样是不是很麻烦呢?于是小编使用Handler消息类延时发送消息(如下),但是这样还是没有达到动态解决效果,这种体验还是极差的。
 new Handler().postDelayed(new Runnable() {@Overridepublic void run() {agentWeb.getJsAccessEntrace().quickCallJs("loadWithAndroid", jsonBean);}},3000);

4)、方案说明
因为是加载的本地文件,所以我们会遇见这些问题,但是在实际项目开发中,在调用接口请求数据、处理返回数据的过程中的耗时操作,再将数据设置上去的时候,是不会出现无法调用的异常的,所以在个人测试过程中,目前小编建议的解决方案是通过按钮点击展示触发是最方便的。

小编也是查询了很多资料都没有找到类似于这种问题的博主,所以小编往后再揪出根源继续更新!

Android中 简洁优秀的AgentWeb框架基本使用相关推荐

  1. Android多媒体开发-- android中OpenMax的实现整体框架

    1.android中用openmax来干啥? android中的 AwesomePlayer就 是用openmax来做(code)编解码,其实在openmax接口设计中,他不光能用来当编解码.通过他的 ...

  2. Android中Http网络请求库框架Volley和Asnyc-http的使用---第三方库学习笔记(一)

    Volley框架: 特点: 通信更快,更简单 Get,Post网络请求及网络图像的高效率异步处理请求. 当多个请求时,对网络请求进行排序,按优先级处理 当网络状况不好时,Volley可以自动对上次请求 ...

  3. Android中图片缓存、显示框架Glide的介绍与使用

    1 介绍 Glide是一个快速高效的Android图片加载库,注重于平滑的滚动.Glide提供了易用的API,高性能.可扩展的图片解码管道(decode pipeline),以及自动的资源池技术. G ...

  4. 框架模式 MVC 在Android中的使用

    算来学习Android开发已有2年的历史了,在这2年的学习当中,基本掌握了Android的基础知识.越到后面的学习越感觉困难,一来是自认为android没啥可学的了(自认为的,其实还有很多知识科学), ...

  5. android espresso跨程序,Android中使用Espresso进行UI测试

    在使用Android Studio创建项目时,Android Studio一般都会自动创建测试相关的包名和类,可见测试在Android Studio开发中具有很重要的地位了,但我却从来没有使用过. 今 ...

  6. android 优秀的开源框架整理

    程序员界有个神奇的网站,那就是github,这个网站集合了一大批优秀的开源框架,极大地节省了开发者开发的时间,在这里我进行了一下整理,这样可以使我们在使用到时快速的查找到,希望对大家有所帮助! 1. ...

  7. 25000字总结Android优秀的第三方框架、各种学习资料汇集 二 Camera、Video、指纹、聊天IM、投屏等等

    前言 前几天总结了Android中常用到的系统组件.Design组件.自定义组件等等系列 点击跳转地址: 25000字总结Android优秀的第三方框架.各种学习资料汇集 一 系统组件.Design组 ...

  8. 每天学习一个Android中的常用框架——0.目录

    文章目录 1.前言 2.环境 3.目录 3.1 持久化 3.1.1 Litepal 3.1.2 GreenDao 3.1.3 Realm 3.1.4 DBFlow 3.2 网络传输 3.2.1 OkH ...

  9. 一个整合OkHttp 、Retrofit 、Volley 、RxJava、Novate多种开源网络框架的项目,高度的封装和集成,Android中Web网络请求一行代码解决

    一个整合OkHttp .Retrofit .Volley .RxJava.Novate多种开源网络框架的项目,高度的封装和集成,Android中Web网络请求一行代码解决 AndroidHttp 一个 ...

最新文章

  1. 二值网络--Optimize Deep Convolutional Neural Network with Ternarized Weights and High Accuracy
  2. oracle top用法
  3. MATLAB常用命令(窗口命令、标点符号特殊功能和帮助命令)
  4. PostgreSQL中如何查看一个表所对应的文件
  5. 这100道Python面试题,你会几道?
  6. MyEclipse web项目导入Eclipse,详细说明
  7. mc服务器word文件夹,我的世界服务器创建:MC个人服务器创建流程
  8. 《ACL 2020丨哈工大多领域端到端任务型对话系统》
  9. Atlantis Lite蓝色精品后台管理系统模板
  10. 日语+AI语音黑科技,早道开启小语种AI智能时代!
  11. 终极算法---读书笔记
  12. 转发:大学课本答案大全!爱死你了…
  13. 基于中间件的开发---中间件技术
  14. 我就是要用MD5!不用不行!那么,怎么防止被拖库后泄露用户密码?
  15. avr单片机c语言程序设计,avr单片机c语言编程风格介绍
  16. 【论文翻译】知识图谱论文中英对照翻译----(KnowLife:a versatile approach ... )
  17. 解决WINDOWS邮箱无法收取QQ邮件
  18. 奶茶店的线上线下营销策略
  19. origin出现demo水印解决方案
  20. 动物网页html5设置思想,网站设计思想

热门文章

  1. v-model的基本使用
  2. 上网行为安全之防火墙端口映射及应用
  3. 比较 KAZE 与 SIFT 的算法
  4. A-KAZE论文研读
  5. 26、BDS B1I电文处理实现
  6. DATABASE SYSTEM CONCEPTS
  7. GhostXP_SP2电脑公司特别版_v7.8
  8. MySQL自然连接删除重复列的问题
  9. 图像处理-图像金字塔
  10. 推荐系统(一)推荐系统整体概览