先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
正文
}
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应用和外设进行通信,通过谷歌提供的一个库来开发。
通过那个库,打开串口。获取输入输出流,就可以利用串口接收数据和发送数据了
核心参数:
path:为串口的物理地址,一般硬件工程师都会告诉你的例如ttyS0、ttyS1等,或者通过SerialPortFinder类去寻找得到可用的串口地址。
baudrate:波特率,与外接设备一致
flags:设置为0,原因较复杂,见文章最底下
10.断点续传实现
=========
-
在本地下载过程中要使用数据库实时存储到底存储到文件的哪个位置了
-
下次继续传递时,才能通过HTTP的GET请求中的setRequestProperty(“Range”,“bytes=startIndex-endIndex”);方法可以告诉服务器,数据从哪里开始,到哪里结束
-
同时在本地的文件写入时,RandomAccessFile的seek()方法也支持在文件中的任意位置进行写入操作
-
最后通过广播或事件总线机制将子线程的进度告诉Activity的进度条。关于断线续传的HTTP状态码是206
11.RxJava 变换操作符 map flatMap concatMap zip buffer
================================================
最后
文章所有资料全部已经打包整理好,另外小编手头上整理了大量Android架构师全套学习资料,Android核心高级技术PDF文档+全套高级学习资料+视频+2021 BAT 大厂面试真题解析
资料展示:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
…(img-x6RZIZk5-1713457995506)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-6OjQSN01-1713457995507)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!