码农弟弟

Results 41 comments of 码农弟弟

1.在不同的环境下采用不同的魔图规则(不同尺寸的缩略图) 2.可以考虑将图片有损转换为webp 3.可以把图片转为rgb565 4.加在大图可以考虑局部加载 防止oom 5.在application中监听内存告警的时候及时释放内存 6.及时做好图片缓存,避免每次都去网络图片取 7.做好lru缓存策略,避免一直缓存的用不到的图片 8.可把一些切图用 xml图形表示 或者.9png 9.使用tinypng对图片进行压缩 10.在gradle中配置 去除无用资源

1.网络频射模块式最耗电的模块之一,做好电量优化首先就是要做好网络优化,不要频繁请求网络,因为每次调用网络之后,系统都会在一定时间内保持活跃,如果可以集中请求网络,可以减少保持活跃的时间 2.及时归还 wakeloc 比如在看视频的时候禁止息屏,退出视频的时候就要及时归还 3.gps使用完毕之后要及时释放 4.要定时轮询的,可以使用 alarmManager ,系统会优化所有的事件,会在误差不大的情况下集中区处理 5.使用jobSchedule, 判断在一定条件下 例如 wifi+充电的情况下 去做操作 6.使用workManager 的区别是 迟早要做 且一定会执行 还有, 有些不重要的事情,比方说埋点,万万不可立即上报 会频繁请求网络. 可以使用workManager 7.向轮播图这种 当不可见的时候 要停止 8.监听充电状态, 有些事情在充电时候去做

直接说下eventbus3吧 发布订阅者模式 通过向 eventbus调度中心 注册 eventbus 中维护了三个map 1map 2map 3.map 用于维护粘性事件 注册的时候 会把信息填入 1,2 两个map, 而订阅信息是怎么获取的呢? 2种方式, 1.runtime注解, 通过反射机制获取 订阅者中被 注解标注的方法,然后 把类信息和方法信息存入map 2.编译时注解, eventbus3 提供了额外的 注解去处理器,可以在编译时生成索引,把类信息在编译时放入索引中.所以在event注册时去查找方法 会先从缓存中找,找不到就判断是否加入了索引,如果加入索引 就直接从索引中取,如果不支持索引,则通过反射机制,获取信息 2这个map适用于反注册的, 通过订阅者找到他的事件,然后移除...

1.aapt 生成R.java mainfest.java 2.生成aidl的java 3.javac 编译所有的java文件生成 .class文件 4.把class生成dex文件 5.混淆 6.把资源文件打包 7.apkbuilder把上述dex和 资源文件 打包成apk 8.jarsinger 签名 9.zipaligin 对齐

那我也说个吧,因为买了腾讯云的视频服务,所以必须要用腾讯云播放器。因为只有用它的播放器才能用腾讯云的防盗链等其他功能。腾讯云的demo是在一个页面上播放视频,而我在此基础上用腾讯云播放器的底层,上层自己封装写了一套播放器组件,特别是针对在列表上的视频播放,接入超级简单。用户反馈说在其他应用播放音乐的情况下,但我们的feed流上看视频,视频结束后音乐没有自动播放。后来深入源码去分析,是腾讯云播放器把音频焦点抢断,而不是临时申请,知道问题好办了,去腾讯云提工单,结果腾讯非常傲娇不肯修复。最后我从混淆过的代码中把申请焦点的代码找到,然后反编译,用汇编去修改代码,最后编译成aar 解决了这个问题。

了解不多 只知道 application service activity 都是具体的context 初始化一些系统组件 如 dialog toast 要把这个context传入 具体由大佬补充

kotlin中interface 可以直接定义方法的实现,java8中也可以通过default关键字 来定义方法的实现,接口是可以定义方法的实现的,而且没有单继承的限制,推荐这么做

kotlin和java一样也是一门jvm语言最后的编译结果都是.class文件,并且可以通过kotlin的.class文件反编译回去java代码,并且封装了许多语法糖,其中我在项目中常用的特性有 1.扩展,(使用非集成的方式 扩张一个类的方法和变量):比方说 px和dp之间的转换 之前可能需要写个Util 现在,通过扩展Float的变量 最后调用的时候仅仅是 123.dp 这样px转成dp了 2.lamdba表达式,函数式编程. lamdba表达式并不是kotlin的专利,java中也有,但是有限制, 像setOnClickListener一样,接口方法只有一个的情况才能调用, 而在kotlin中对接口的lambda也是如此,有这样的限制,但是他更推荐你使用闭包的方式而不是实现匿名接口的方式去实现这样的功能,闭包对lambda没有接口这么多的限制,另外就是函数式编程 在java8中提供了streamApi 对集合进行map sort reduce等等操作,但是对android api有限制,为了兼容低版本,几乎不可能使用streamApi 3.判空语法 省略了许多if xxx==null 的写法 也避免了空指针异常 aaa?.toString ?: "空空如也" 当aaa为空的时候 它的值被"空空如也"替代 aaa?.let{ it.bbb...

非静态内部类对外部有一个引用 context被单例持有 context被静态变量持有 bitmap没回收 bus没反注册 资源对象没关闭(cursor) 总而言之就是 持有了 本该没有继续使用的对象,导致他无法释放, gcroot 检测方式有以下几种 1.leakCanary 原理是, 用activityfragmentlifecyclercallback 去监听acvivity 或者 fragment 的ondestory时机 并且弱引用持有他们, 把他们的弱引用关联到引用队列 引用队列的作用是, 当 和他关联的引用发生变化会被添加进这个引用队列 于是 当activity 或 fragment ondestory的时候 会去检测 这些弱引用是否被回收,如果没有则触发gc(此时肯定没有leak...

屏幕刷新频率和绘制频率 cpu 负责 measure layout draw => displayList gpu 负责 display => 位图 每个16ms会发送一次垂直同步信号 vsync 每次信号发送的时候都会从gpu的buffer中取出渲染好的位图 显示在屏幕上 同时如果有需要 还会进行下一次的 cpu计算,计算好后放入buffer中 如果计算时间超过了两次vsync之间的时间 即16ms 则 vsync信号会把 上一次gpu buffer中的信息展示出来 这时候就是卡顿 另外如果页面没有变化 屏幕还是一样会去buffer中取出上一次的刷新,只不过cpu不再去计算而已