public class MutableLiveData extends LiveData {
//非主线程中使用
@Override
public void postValue(T value) {
super.postValue(value);
}
//主线程中使用
@Override
public void setValue(T value) {
super.setValue(value);
}
}
通过LiveData的postValue或者setValue方法,通知观察者Observer数据的变化并请可观察的变化数据通过Observer的onChanged传导出来
其优点有
-
遵从应用程序的生命周期,如在Activity中如果数据更新了但Activity已经是destroy状态,LivaeData就不会通知Activity(observer)
-
不会造成内存泄漏(LiveData仅通知活跃的Observer去更新UI。 非活跃状态的Observer,即使订阅了LiveData,也不会收到更新的通知)
LiveData的observe方法
@MainThread
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer observer) {
if (owner.getLifecycle().getCurrentState() == DESTROYED) {
// ignore
return;
}
LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
if (existing != null && !existing.isAttachedTo(owner)) {
throw new IllegalArgumentException(“Cannot add the same observer”
- " with different lifecycles");
}
if (existing != null) {
return;
}
//将LifecycleBoundObserver和activity或者fragment的lifeCycle相关联
owner.getLifecycle().addObserver(wrapper);
}
装饰器LifecycleBoundObserver
class LifecycleBoundObserver extends ObserverWrapper implements LifecycleEventObserver {
@NonNull
final LifecycleOwner mOwner;
LifecycleBoundObserver(@NonNull LifecycleOwner owner, Observer<? super T> observer) {
super(observer);
mOwner = owner;
}
@Override
boolean shouldBeActive() {
return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED);
}
@Override
public void onStateChanged(@NonNull LifecycleOwner source,
@NonNull Lifecycle.Event event) {
//数据发生变化,如果activity或者fragment已经销毁,就解除订阅,避免了内存泄露
if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {
removeObserver(mObserver);
return;
}
activeStateChanged(shouldBeActive());
}
…
public interface Observer {
/**
-
Called when the data is changed.
-
@param t The new data
*/
void onChanged(@Nullable T t);
}
第一个参数可以直接传activity,如果activity已经销毁直接return,否则owner.getLifecycle().addObserver(wrapper);,LiveData调用postValue或者setValue方法就会回调Observer的onChanged方法
-
LiveData的observe方法接收activity的getLifeCycle(可感知activity生命周期)和Observer(添加一个观察者到LiveData的内部集合里)。
-
LiveData的setValue方法将数据通知到所有观察者,如果actiivty已经销毁则之间解除订阅。否则所有观察者的onChange(T t)方法会被执行
这数据处理逻辑放在ViewModel里,需要更新UI时给观察者发送通知即可,同时不用关心内存泄漏
4.ViewModel
===========
-
处理逻辑
-
存储数据,ViewModel储存的数据activity旋转后数据不会丢失
-
数据共享
5.Flowable和Observable
=====================
RxJava1中使用Observable和Observer建立起订阅关系,但会产生背压问题。Rxjava2使用Flowable和Subscriber替换RaJava1的Observable和Observer。Flowable是在Observable的基础上优化后的产物,Observable能解决的问题Flowable也都能解决。但是并不代表Flowable可以完全取代Observable,Flowable运行效率要比Observable慢得多。 只有在需要处理背压问题时,才需要使用Flowable
-
当上下游在不同的线程中,通过Observable发射,处理,响应数据流时,如果上游发射数据的速度快于下游接收处理数据的速度,这样对于那些没来得及处理的数据就会造成积压,这些数据既不会丢失,也不会被垃圾回收机制回收,而是存放在一个异步缓存池中,如果缓存池中的数据一直得不到处理,越积越多,最后就会造成内存溢出,这便是响应式编程中的背压(backpressure)问题
-
如果能够确定:
-
上下游运行在同一个线程中
-
上下游工作在不同的线程中,但是下游处理数据的速度不慢于上游发射数据的速度
-
上下游工作在不同的线程中,但是数据流中只有一条数, 则不会产生背压问题,就没有必要使用Flowable,以免影响性能。
6.app优化
=======
-
内存优化:使用leakcanary抓取内存泄露,或者使用android studio抓取内存信息,通过Profiler分析内存泄露情况
-
体积优化 不复杂图片使用svg代替png。换肤时使用着色器,可减少图片资源 build文件配置 保留指定语言 保留指定so库架构 开启混淆压缩
7.Rxjava中关于Disposable
=====================
Rxjava容易遭层内存泄漏。在订阅了事件后没有及时取阅,导致在activity或者fragment销毁后仍然占用着内存,无法释放。而disposable,可以用来取消订阅
8.Glide
=======
-
Glide的缓存 Glide缓存机制大致分为三层:Lru算法缓存、弱引用缓存、磁盘缓存 读取的顺序是:Lru算法缓存、弱引用缓存、磁盘缓存(据说glide最新版改了,先从弱引用中取,没有的话再从Lru中取,再放进弱引用中)
-
Glide.with(this) .load(“http://www.baidu.com/img/bdlogo.png”) .into(imageView); with()方法是对RequestManager进行配置 public static RequestManager with(FragmentActivity activity) { return getRetriever(activity).get(activity); } 复制代码 load()方法是对RequestBuilder进行配置 public RequestBuilder load(@Nullable Object model) { return asDrawable().load(model); } 复制代码 into()方法是通过线程池给imageView进行图片的加载设置
-
占用内存较小 默认使用RGB_565格式
-
支持gif
-
与Activity生命周期绑定,不会出现内存泄露 Glide绑定Activity时,生成一个无UI的Fragment 将无UI的Fragment的LifeCycle传入到RequestManager中 在RequestManager的构造方法中,将RequestManager存入到之前传入的Fragment的LifeCycle,在回调LifeCycle时会回调到Glide的相应方法
9.Android串口
===========
通过串口编程可以让Android应用和外设进行通信,通过谷歌提供的一个库来开发。
通过那个库,打开串口。获取输入输出流,就可以利用串口接收数据和发送数据了
核心参数:
小结
有了这么多优秀的开发工具,可以做出更高质量的Android应用。
当然了,“打铁还需自身硬”,想要写出优秀的代码,最重要的一点还是自身的技术水平,不然用再好的工具也不能发挥出它的全部实力。
在这里我也分享一份大佬自己收录整理的Android学习PDF+架构视频+面试文档+源码笔记,还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料这些都是我闲暇还会反复翻阅的精品资料。在脑图中,每个知识点专题都配有相对应的实战项目,可以有效的帮助大家掌握知识点。
总之也是在这里帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!