第一周:
①学习了hashmap更具体的知识:
JDK1.8中hashmap对链表很长时的优化,当链表长度太长时,链表就转换为红黑树,这样大大提高了查找的效率。红黑树是自平衡的二叉查找树,拥有二叉树的特性,又额外增加了特性。
二叉树可能的时间复杂度是O(N),为了避免出现这种情况,使用红黑树,当新插入的数据破坏红黑树平衡时,它会重新达到平衡。
第二周:
①内存泄漏需要注意的点
内存泄漏最核心的本质是:对象不再被应用程序使用,但垃圾回收器却不能移除它们,因为它们还在被引用。
常见的内存泄漏是内部类, 单例引用。 如果单例需要传入context, 需要看是否引用这个context,而不是传入context参数就会存在内存泄漏。
②学习Eventbus源码
(1)注册:
Eventbus.getDefault().register(Object),首先Eventbus.getDefault()获得Eventbus单例,之后调用register(Object)方法, 找到Object的类的onEvnet方法。
private synchronized void register(Object subscriber, String methodName, boolean sticky, int priority) {
List<SubscriberMethod> subscriberMethods = this.subscriberMethodFinder.findSubscriberMethods(subscriber.getClass(), methodName);
Iterator var6 = subscriberMethods.iterator();
while(var6.hasNext()) {
SubscriberMethod subscriberMethod = (SubscriberMethod)var6.next();
this.subscribe(subscriber, subscriberMethod, sticky, priority);
}
}
遍历subscriberMethods,执行subscribe(subscriber, subscriberMethod),这个方法中主要做根据优先级把 subscriberMethod 插入到 subscriptions 中,将 eventType 放入到 subscribedEvents 中, 如果订阅方法支持 sticky ,那么发送相关的粘性事件。
第三周:
①学习Eventbus源码
反注册
在之前 register(Object subscriber) 中 subscriptionsByEventType 和 typesBySubscriber 会对 subscriber 间接进行绑定。而在 unregister(Object subscriber) 会对其解绑,这样就防止了造成内存泄露的危险。
②android适配:分区存储适配
范围:
android 9及以下不需要适配
android 10仅对targetSdkVersion>=29则会开启分区存储。targetSdkVersion小于29则不会有任何限制与android9及以下同理。
andorid 11强制执行分区存储。不允许应用读写操作非应用沙盒目录和系统公共目录下的资源文件。
适配方式:
使用ContentResolver进行文件的增删改查
第四周:
①学习源码
post(Object event)方法:
在 post(Object event) 中,首先根据 currentPostingThreadState 获取当前线程状态 postingState 。currentPostingThreadState 其实就是一个 ThreadLocal 类的对象,不同的线程根据自己独有的索引值可以得到相应属于自己的 postingState 数据。 然后把事件 event 加入到 eventQueue 队列中排队。只要 eventQueue 不为空,就不间断地发送事件。而发送单个事件的代码在 postSingleEvent(Object event, PostingThreadState postingState) 中。postSingleEvent(Object event, PostingThreadState postingState) 中的代码逻辑还是比较清晰的,会根据 eventInheritance 分成两种: 支持事件继承:得到 eventClass 的所有父类和接口,然后循环依次发送事件; 不支持事件继承:直接发送事件。 另外,若找不到订阅者,在默认配置下还会发送 NoSubscriberEvent 事件。
②glide缓存
内存作为一级缓存,本地作为二级缓存,网络加载为最后。其中,内存使用 LruCache ,其内部通过 LinkedhashMap 来持有外界缓存对象的强引用;对于本地缓存,使用 DiskLruCache。加载图片的时候,首先使用 LRU 方式进行寻找,找不到指定内容,按照三级缓存的方式,进行本地搜索,还没有就网络加载。
第五周:(2021年5月31日)
ThreadLocal的源码:
ThreadLocal类是线程本地变量。也就是说如果定义了一个ThreadLocal,每个线程往这个ThreadLocal中读写是线程隔离,互相之间不会影响的。它提供了一种线程封闭的机制。 Thread类有一个类型为ThreadLocal.ThreadLocalMap的实例变量threadLocals,每个线程有一个自己的ThreadLocalMap。ThreadLocalMap有自己的独立实现,每个线程在往某个ThreadLocal里塞值的时候,都会往自己的ThreadLocalMap里存,读也是以某个ThreadLocal作为引用,在自己的map里找对应的key,从而实现了线程隔离。
使用场景:
两个线程需要同时连接sqlite数据库,一个线程关闭数据库, 影响另一个线程。使用ThreadLocal让数据库连接不共享。
第六周:(2021年6月7日)
Rxjava使用:
使用Rxjava实现异步操作。
Observable (被观察者)、 Observer (观察者)、 subscribe (订阅)、事件。Observable 和 Observer 通过 subscribe() 方法实现订阅关系,从而 Observable 可以在需要的时候发出事件来通知 Observer。
使用Scheduler 实现线程切换,
subscribeOn(): 指定 subscribe() 所发生的线程,即 Observable.OnSubscribe 被激活时所处的线程。或者叫做事件产生的线程。 observeOn(): 指定 Subscriber 所运行在的线程。或者叫做事件消费的线程。
Rxjava操作符:
一:创建操作 二:合并操作 三:过滤操作 四:切换线程 五:条件/布尔操作 六:聚合操作 七:转换操作 八:变换操作 九:错误处理/重试机制 十:连接操作 十一:阻塞操作 十二:工具集 十三:Flowable (2.0出来的) 非操作符
操作符有点多,暂时记不住。
注意点:
如果Rxjava正在执行,但是页面已经退出,会发生内存泄漏,解决办法:
①老项目:
老项目之前的baseActivity可能会影响到,直接得到Disposable,在activity的onDestroy调用Disposable.cancel();
②新项目:
使用RxLifecycle,调用.compose(this.<Long>bindUntilEvent(ActivityEvent.DESTROY)),在activity的onDestroy方法被调用时取消订阅。
网友评论