Android中 简洁优秀的AgentWeb框架基本使用
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框架基本使用相关推荐
- Android多媒体开发-- android中OpenMax的实现整体框架
1.android中用openmax来干啥? android中的 AwesomePlayer就 是用openmax来做(code)编解码,其实在openmax接口设计中,他不光能用来当编解码.通过他的 ...
- Android中Http网络请求库框架Volley和Asnyc-http的使用---第三方库学习笔记(一)
Volley框架: 特点: 通信更快,更简单 Get,Post网络请求及网络图像的高效率异步处理请求. 当多个请求时,对网络请求进行排序,按优先级处理 当网络状况不好时,Volley可以自动对上次请求 ...
- Android中图片缓存、显示框架Glide的介绍与使用
1 介绍 Glide是一个快速高效的Android图片加载库,注重于平滑的滚动.Glide提供了易用的API,高性能.可扩展的图片解码管道(decode pipeline),以及自动的资源池技术. G ...
- 框架模式 MVC 在Android中的使用
算来学习Android开发已有2年的历史了,在这2年的学习当中,基本掌握了Android的基础知识.越到后面的学习越感觉困难,一来是自认为android没啥可学的了(自认为的,其实还有很多知识科学), ...
- android espresso跨程序,Android中使用Espresso进行UI测试
在使用Android Studio创建项目时,Android Studio一般都会自动创建测试相关的包名和类,可见测试在Android Studio开发中具有很重要的地位了,但我却从来没有使用过. 今 ...
- android 优秀的开源框架整理
程序员界有个神奇的网站,那就是github,这个网站集合了一大批优秀的开源框架,极大地节省了开发者开发的时间,在这里我进行了一下整理,这样可以使我们在使用到时快速的查找到,希望对大家有所帮助! 1. ...
- 25000字总结Android优秀的第三方框架、各种学习资料汇集 二 Camera、Video、指纹、聊天IM、投屏等等
前言 前几天总结了Android中常用到的系统组件.Design组件.自定义组件等等系列 点击跳转地址: 25000字总结Android优秀的第三方框架.各种学习资料汇集 一 系统组件.Design组 ...
- 每天学习一个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 ...
- 一个整合OkHttp 、Retrofit 、Volley 、RxJava、Novate多种开源网络框架的项目,高度的封装和集成,Android中Web网络请求一行代码解决
一个整合OkHttp .Retrofit .Volley .RxJava.Novate多种开源网络框架的项目,高度的封装和集成,Android中Web网络请求一行代码解决 AndroidHttp 一个 ...
最新文章
- 二值网络--Optimize Deep Convolutional Neural Network with Ternarized Weights and High Accuracy
- oracle top用法
- MATLAB常用命令(窗口命令、标点符号特殊功能和帮助命令)
- PostgreSQL中如何查看一个表所对应的文件
- 这100道Python面试题,你会几道?
- MyEclipse web项目导入Eclipse,详细说明
- mc服务器word文件夹,我的世界服务器创建:MC个人服务器创建流程
- 《ACL 2020丨哈工大多领域端到端任务型对话系统》
- Atlantis Lite蓝色精品后台管理系统模板
- 日语+AI语音黑科技,早道开启小语种AI智能时代!
- 终极算法---读书笔记
- 转发:大学课本答案大全!爱死你了…
- 基于中间件的开发---中间件技术
- 我就是要用MD5!不用不行!那么,怎么防止被拖库后泄露用户密码?
- avr单片机c语言程序设计,avr单片机c语言编程风格介绍
- 【论文翻译】知识图谱论文中英对照翻译----(KnowLife:a versatile approach ... )
- 解决WINDOWS邮箱无法收取QQ邮件
- 奶茶店的线上线下营销策略
- origin出现demo水印解决方案
- 动物网页html5设置思想,网站设计思想