zhangmingzhu
zhangmingzhu
其他程序可以通过ContentResolver来操作ContentProvider暴露的数据 1. 自己自定义一个ContentProvider,通过uri的形式对外提供数据
1. 最开始的是DNS,当我们发起一个网络请求,首先要经过DNS服务将域名转化为ip地址,为避免dns解析异常,可以直接使用ip建立连接 2. 使用gzip压缩Response减少数据传输量;使用protocol Buffer代替JSOn 3. 请求图片的url中可以添加格式,质量,宽高等参数;使用缩略图,webp格式图片,大图分片传输。 4. 使用网络缓存,使用图片加载框架 5. 监听设备的网络状态,根据不同网络状态选择对应情况下的网络请求策略:网络良好和弱网、离线等情况下分别设计不同的请求策略,比如wifi下一个请求可以获取几十个数据,甚至可以一次性执行多个请求,而弱网情况下一个请求获取姐数据,且文本类型有限,富文本其次,除文本数据外其他类型的数据一开始只显示占位符;李线下事先保存数据到磁盘,在离线是从磁盘加载数据。
首先确定需求是否大图可以缩放,如果需要缩放一般图片的宽高都会挺大,如果只是显示就没有必要弄得太大。 1. 如果加载一般的图片,宽高就跟控件宽高差不多。 i. 图片尽量使用软引用,较大的图片可以通过bitmapFactory缩放后在使用,并及时recycle。 ii. 加载巨图时不要使用setImageBitmap或setImageResourse或BitmapFactory.decodeResourse,这些方法拿到的都是bitmap的对象,占用内存较大。可以用BitmapFactory.decodeStream方法配合BitmapFactory.Options进行缩放 2. 加载超大宽高的图片就是分区加载,主要要用到的是BitmapRegionDecoder这个类decodeRegion的方法,读取图片指定大小的数据,然后通过移动来动态改变显示区域的图片
apply:返回自身用this代指 let:返回最后一行 It代指 with:会把它的第一个参数装换成第二个参数传给它的接受者,通过this来访问但它不防空,所以很少用
开启混淆 1. 查看项目使用的第三方哪些需要设置混淆 2. 保持反射native对应的类和方法不混淆 3. 保持自定义类不混淆 4. 保持实体类参与序列化的不混淆 5. 系统组件等一些固定方法会被系统调用的不混淆
不能直接更新Ui,直接更新会崩溃,但你更改的内容还是会变化的,因为你子线程更新了,但此时主线程不知道,主线程用来绘制ui,所以会崩溃。下面方法可以用来在子线程更新UI 1. new Handler(getMainLooper).post(new Runnable(){} 2. runOnUiThread(new Runable){} 3. 通过handler发送message来更新Ui 其实runOnUiThread内部就是调用new Handler(getMainLooper).post,而new Handler(getMainLooper).post内部调用的是sendMessageDelayed,所以更新Ui的原理就是通过handler发送message
LruCache是最近最少使用算法 是用LinkedHashMap实现的简单的内存的缓存,是强引用。 如果添加的数据大于设置的最大的缓存数据,就删除最先缓存的或不使用的数据来调整内存。
1. 开启一个像素的Activity进行保活 2. 前台服务 3. 用系统广播进行相互唤醒 4. JobScheduler
当线程处于等待、超时等待的时候会调用notify和notifyAll通知线程更改状态,当只有一个线程的时候,这两个效果一样,会唤醒一个线程并获取锁。当线程数量大于1的时候notify会唤醒一个线程,nitifyAll会唤醒所有线程并选取其中一个线程获取锁。
1.grandle文件中开启混淆,shrinkResources去掉无用资源,resConfigs "zh"去掉无用资源 2.图片尽量用webp,或者用tinypng压缩一下 3.避免导入重复的库