美文网首页
常用三方库知识点

常用三方库知识点

作者: 那个那个谁哇 | 来源:发表于2019-05-05 13:46 被阅读0次

    RxJava2+Retrofit2+OkHttp3

    android注解(框架常用)

    glide与picasso

    Picasso加载了完整尺寸的图片(1920x1080像素)进入内存,当绘图的时候,让GPU即时的恢复到所需要的尺寸(768x432像素),然而Glide则加载精确的imageview尺寸进入内存,通过实验可以发现(1920x1080 像素的图片被加载到768x432像素的imageview中),Glide缓存的是768x432像素的图片,而Picasso缓存的是整张图片(1920x1080像素)。当我们调整imageview的大小时,Picasso会不管imageview大小是什么,总是直接缓存整张图片,而Glide就不一样了,它会为每个不同尺寸的Imageview缓存一张图片,也就是说不管你的这张图片有没有加载过,只要imageview的尺寸不一样,那么Glide就会重新加载一次,这时候,它会在加载的imageview之前从网络上重新下载,然后再缓存。
    Glide的这种默认的缓存机制有一个优点,就是它可以加快图片加载的速度(可以理解为以空间换时间),而Picasso会造成一定的延迟,因为它在加载到imageview的时候,总是需要调整大小。Glide的一个明显的优点就是它可以加载gif图片,因为Glide被设计成能和Activity/Fragment的生命周期完美的相结合,因此gif动画将随着Activity/Fragment的生命周期自动的开始和停止

    okhttp框架

    1、共享Socket,减少对服务器的请求次数,通过复用连接池,减少了请求延迟
    2、通过一系列的拦截器调用来发起网络请求
    3、同时支持同步异步调用回调函数响应
    4、使用LruCache缓存数据避免重复网络请求
    3、google在Android 6.0中删除了HttpClient的Api,采用的是则是okhttp

    evenbus与广播

    EventBus是一个Android平台轻量级的事件总线框架极大的简化了Activity、Fragment、Service等组件之间的交互,很大程度上降低了他们之间的耦合,从而使得我们代码更加简洁,耦合性更低,提升我们的代码质量
    广播是重量级的,消耗资源较多的方式
    EventBus设计之初是用于同一进程的消息发送和接收
    BroadcastReciver可以在不同进程间发送和接收消息

    EventBus是如何获取被注解的方法信息的呢?

    1、通过反射获取,将subscriberClass类本身以及它的父类中的方法都遍历一遍,找到使用@subscribe注解的方法,缺点是反射耗时,以及当类中方法很多的时候会影响性能
    2、编译时注解生成索引,这种方法需要引入编译处理器processor,在编译期间就生成注解的方法的索引,这样就可以解决反射造成的性能问题

    greendao

    GreenDao是一个高效的数据库访问ORM(对象关系映射)框架,节省了自己编写SQL的时间,快速的增删查改等操作。Orm好处就是简化了数据库查询过程,用户可以访问期望数据,而不必理解数据库的底层结构
    有点:效率高、体积小、占用内存小,效率很高,插入和更新的速度是sqlite的2倍,加载实体的速度是ormlite的4.5倍

    ButterKnife

    ButterKnife通过注解进行view、string、点击事件的绑定,减少用户代码量,使代码更加简洁,
    原理:
    在编译期间,注解处理器找到注解的变量或方法,通过注解信息以及借助一些生成源文件的库(如:JavaPoet)动态生成java文件,生成的java文件其实就是我么平时写的findviewbyid()、setonclicklistener()的代码。

    RxJava

    注意点:
    1、subscribeOn() 指定的就是发射事件的线程,observerOn 指定的就是订阅者接收事件的线程
    2、多次指定发射事件的线程只有第一次指定的有效,也就是说多次调用 subscribeOn() 只有第一次的有效,其余的会被忽略。
    3、但多次指定订阅者接收线程是可以的,也就是说每调用一次 observerOn(),下游的线程就会切换一次。
    场景使用:
    1、采用 map 操作符进行网络数据解析
    2、采用 concat 操作符先读取缓存再通过网络请求获取数据,利用 concat 的必须调用 onComplete 后才能订阅下一个 Observable 的特性,我们就可以先读取缓存数据,倘若获取到的缓存数据不是我们想要的,再调用 onComplete() 以执行获取网络数据的 Observable,如果缓存数据能应我们所需,则直接调用 onNext(),防止过度的网络请求,浪费用户的流量
    3、实现多个网络请求依次依赖flatMap,解决(接口)循环嵌套,concatMap操作符的功能和flatMap是非常相似的,只是有一点,concatMap 最终输出的数据序列和原数据序列是一致,它是按顺序链接Observables

    4、善用 zip 操作符,实现多个接口数据共同更新 UI
    5、采用 interval 操作符实现心跳间隔任务

    Flowable背压支持

    Luban压缩图片

    以上三方库绝大部分有用到了线程池,线程池的好处、原理、类型?

    (1)线程池的好处:
    重用线程池中的线程,避免线程的创建和销毁带来的性能消耗;
    有效控制线程池的最大并发数,避免大量的线程之间因互相抢占系统资源而导致阻塞现象;进行线程管理,提供定时/循环间隔执行等功能

    (2)线程池的分类:
    FixThreadPool:线程数量固定的线程池,所有线程都是核心线程,当线程空闲时不会被回收;能快速响应外界请求。
    CachedThreadPool:线程数量不定的线程池(最大线程数为Integer.MAX_VALUE),只有非核心线程,空闲线程有超时机制,超时回收;适合于执行大量的耗时较少的任务
    ScheduledThreadPool:核心线程数量固定,非核心线程数量不定;可进行定时任务和固定周期的任务。
    SingleThreadExecutor:只有一个核心线程,可确保所有的任务都在同一个线程中按顺序执行;好处是无需处理线程同步问题。
    (3)线程池的原理:实际上通过ThreadPoolExecutor并通过一系列参数来配置各种各样的线程池,具体的参数有:
    corePoolSize核心线程数:一般会在线程中一直存活
    maximumPoolSize最大线程数:当活动线程数达到这个数值后,后续的任务将会被阻塞keepAliveTime非核心线程超时时间:超过这个时长,闲置的非核心线程就会被回收
    unit:用于指定keepAliveTime参数的时间单位
    workQueue任务队列:通过线程池的execute()方法提交的Runnable对象会存储在这个参数中。
    threadFactory:线程工厂,可创建新线程
    handler:在线程池无法执行新任务时进行调度

    线程池的工作原理:

    1、若当前运行的线程少于corePoolSize,则创建新线程来执行任务
    2、若运行的线程多于或等于corePoolSize,则将任务加入BlockingQueue
    3、若无法将任务加入BlockingQueue,则创建新的线程来处理任务
    4、若创建新线程将使当前运行的线程超出maximumPoolSize,任务将被拒绝,并调用RejectedExecutionHandler.rejectedExecution()

    相关文章

      网友评论

          本文标题:常用三方库知识点

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