美文网首页
学习计划

学习计划

作者: yangSmallXing | 来源:发表于2021-06-15 12:37 被阅读0次

    第一周:

    ①学习了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方法被调用时取消订阅。

    相关文章

      网友评论

          本文标题:学习计划

          本文链接:https://www.haomeiwen.com/subject/fdrzeltx.html