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

Android开发小贴士

Android开发小贴士

1.使用Glide库提取视频帧

图片加载框架Glide就可以做到获取本地视频的缩略图(不能获取网络视频文件):

String filePath = "/storage/emulated/0/Pictures/example_video.mp4";
Glide  .with( context ).load( Uri.fromFile( new File( filePath ) ) ).into( imageViewGifAsBitmap );
泛型相关
通过反射获取一个Field对象的泛型类型
 /**
* 获取某一个字段上面的泛型参数数组,典型的就是获取List对象里面是啥参数
* 
* @param f
* @return
*/
public static Class<?>[] getParameterizedType(Field f) {// 获取f字段的通用类型Type fc = f.getGenericType(); // 关键的地方得到其Generic的类型// 如果不为空并且是泛型参数的类型if (fc != null && fc instanceof ParameterizedType) {ParameterizedType pt = (ParameterizedType) fc;Type[] types = pt.getActualTypeArguments();if (types != null && types.length > 0) {Class<?>[] classes = new Class<?>[types.length];for (int i = 0; i < classes.length; i++) {classes[i] = (Class<?>) types[i];}return classes;}}return null;
}
TypeToken

解析泛型Json

    //构造泛型JsonList<Map<Integer, String>> list = new ArrayList();HashMap<Integer, String> map = new HashMap<>();map.put(1, "111111111");list.add(map);for (int i = 0; i < 10; i++){HashMap<Integer, String> map1 = new HashMap<>();map1.put(i, String.valueOf(i*1000));list.add(map1);}Gson gson = new Gson();String str = gson.toJson(list);Log.i(TAG, "str:" + str);//解析泛型JsonType type = new TypeToken<List<Map>>() {}.getType();List<Map> myList = gson.fromJson(str, type);if (list != null) {for (Map<Integer, String> bean : list) {for (Map.Entry<Integer, String> entry : bean.entrySet()) {Log.i(TAG, "key = " + entry.getKey() + ";value = " + entry.getValue());}}}
ParameterizedType

假设不只一个json数组字符串需要你解析,很显然重复的代码应该抽象成一个方法。
关于Student的数组:

[{"name": "zhaoxa","score": 100},{"name": "zhaoxa2","score": 76},{"name": "zhaoxa3","score": 99},{"name": "zhaoxa4","score": 48}
]

关于Book的数组

[{"author": "zhaoxa","name": "如何入门android","price": 100},{"author": "zhaoxa2","name": "如何入门android2","price": 76},{"author": "zhaoxa3","name": "如何入门android3","price": 99},{"author": "zhaoxa4","name": "如何入门android4","price": 48}
]

抽象一个泛型的方法出来,把json数组字符串转化成类。

第一次尝试

public <T> List<T> parseString2List(String json){T[] array = new Gson().fromJson(json, T[].class);List<T> list = Arrays.asList(array);return list;
}

报错了,fromJson不支持使用泛型解析。

第二次尝试

public <T> List<T> parseString2List(String json) {Type type = new TypeToken<List<T>>(){}.getType();List<T> list = new Gson().fromJson(jsonString,type);return list;}

嗯,没有报错,我们运行时断点看看list里的数据类型。

我们通过这句话调用方法:

List<Student> list = parseString2List(jsonString);

可以看到,list中的数据类型不是Student,而是LinkedTreeMap,LinkedTreeMap是Gson库内部数据模型,换句话说我们的解析失败了,尝试着将parseString2List方法中的泛型T去掉,运行结果一样,说明Gson解析时不支持泛型。

第三次尝试

public <T> List<T> parseString2List(String json,Class clazz) {Type type = new ParameterizedTypeImpl(clazz);List<T> list =  new Gson().fromJson(json, type);return list;}private  class ParameterizedTypeImpl implements ParameterizedType {Class clazz;public ParameterizedTypeImpl(Class clz) {clazz = clz;}@Overridepublic Type[] getActualTypeArguments() {return new Type[]{clazz};}@Overridepublic Type getRawType() {return List.class;}@Overridepublic Type getOwnerType() {return null;}}

在调用的地方使用:

List<Student> list = parseString2List(jsonString, Student.class);
List<Book> list2 = parseString2List(jsonString, Book.class);

现在在回过头来看看,ParameterizedType的几个方法的含义吧,以HashMap<String,Integer>为例。

  • getActualTypeArguments 返回实际类型组成的数据,即new Type[]{String.class,Integer.class}
  • getRawType 返回原生类型,即 HashMap
  • getOwnerType 返回 Type 对象,表示此类型是其成员之一的类型。例如,如果此类型为 O.I,则返回 O 的表示形式。 如果此类型为顶层类型,则返回 null。这里就直接返回null就行了。

相关文章:

  • 高级java每日一道面试题-2024年9月26日-运维篇[分布式篇]-如何保证每个服务器的时间都是同步的?
  • 【网络安全】网络基础第一阶段——第三节:网络协议基础---- VLAN、Trunk与三层交换技术
  • 【WPF】多屏幕展示
  • 【QGIS】软件下载安装及GIS4WRF插件使用
  • 百度amis框架经验分享
  • 第二十节:学习Redis缓存数据库实现增删改查(自学Spring boot 3.x的第五天)
  • 给子组件传递dom元素引用实例方案
  • OJ在线评测系统 前端创建题目(增) 更新题目(改) 题目列表(查) 以及做题页面的开发 基于VUECLI脚手架画界面
  • Docker部署MongoDB教程
  • Spring 事务管理-AOP
  • python学习-13【网络编程】
  • SBB Usage Parameters
  • Supervision 计算机视觉工具
  • 【网络安全】网络基础第一阶段——第四节:网络协议基础---- VRRP与网络架构设计
  • 基站定位与Wi-Fi定位?看这篇就够了
  • Android 架构优化~MVP 架构改造
  • Angular4 模板式表单用法以及验证
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Flannel解读
  • IDEA 插件开发入门教程
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • Terraform入门 - 3. 变更基础设施
  • 聚类分析——Kmeans
  • 前端代码风格自动化系列(二)之Commitlint
  • 自制字幕遮挡器
  • 如何在招聘中考核.NET架构师
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • # 数仓建模:如何构建主题宽表模型?
  • #162 (Div. 2)
  • #前后端分离# 头条发布系统
  • (1)(1.13) SiK无线电高级配置(五)
  • (CPU/GPU)粒子继承贴图颜色发射
  • (Java)【深基9.例1】选举学生会
  • (NSDate) 时间 (time )比较
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (算法二)滑动窗口
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (一)UDP基本编程步骤
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (正则)提取页面里的img标签
  • (转)Windows2003安全设置/维护
  • (转)德国人的记事本
  • ***测试-HTTP方法
  • .NET Core跨平台微服务学习资源
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NET6 命令行启动及发布单个Exe文件
  • .NET学习教程二——.net基础定义+VS常用设置
  • .NET正则基础之——正则委托
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)