第六天笔记

image-20240711082142108

image-20240711083101972

image-20240711084043441

组件库笔记

1. 组件库依赖、发布和使用

依赖方式对比
2.x版本 3.x版本 说明
apk runtimeOnly apk 功能同 runtimeOnly。只在生成 apk 时参与打包,编译时不会参与。Gradle 只会将依赖项添加到构建输出,以便在运行时使用。
provided compileOnly provided 功能同 compileOnly。只在编译时有效,不会参与打包至 apk。
compile api compile 功能同 api。该依赖方式会传递所依赖的库,当其他 module 依赖了该 module 时,可以使用该 module 下使用 api 依赖的库。
- implementation 该依赖方式所依赖的库不会传递,只会在当前 module 中生效。

格式介绍

格式 介绍 差异
AAR AAR 文件包含了 Android 库项目的代码、资源文件和清单文件等信息,可以被其他 Android 应用程序引用和使用。 Android 特有的归档文件格式,主要用于打包 Android 库项目。
JAR JAR 文件包含了 Java 类文件、资源文件和清单文件等信息,可以被其他 Java 应用程序引用和使用。 Java 中常用的归档文件格式,用于打包 Java 类库和应用程序。

依赖添加方式

  1. 本地依赖

    将 Jar 文件放置在项目的 libs 目录下,并在项目的 build.gradle 文件中添加以下依赖:

    dependencies {
        implementation files('libs/library_name.jar')
    }
    

    其中,library_name.jar 是 Jar 文件的名称。

  2. 仓库依赖

    Jar 文件发布到 Maven 仓库或 JCenter 等公共仓库中,并在项目的 build.gradle 文件中添加以下依赖:

    dependencies {
        implementation 'group_id:artifact_id:version'
    }
    

    其中,group_id 是 Jar 文件所属的组织或公司的 ID,artifact_id 是 Jar 文件的名称,version 是 Jar 文件的版本号。

    • Maven 仓库地址: https://repo.maven.apache.org/maven2/
    • JCenter 仓库: https://jcenter.bintray.com/

3. 自定义仓库

a. 配置

mavenDeployer {
    // 本地 maven 仓库的路径
    repository(url: uri("$rootDir/maven"))
    // 生成 maven 依赖的组名
    pom.groupId = 'com.xiaomi.lib'
    // 生成 maven 依赖的模块名称
    pom.artifactId = 'image'
    // 生成 maven 依赖的版本号
    pom.version = '1.0.0'
}

b. 发布

  1. 在 Android Studio 中 Gradle 面板工程的根目录找到功能菜单:

    • CircleImageLib -> Task -> upload -> uploadArchives
  2. 双击 uploadArchives 开始打包发布或在 Terminal 命令行中执行:

    ./gradlew uploadArchives
    

c. 引用

  1. 在工程根目录的中的

    repositories
    

    中添加仓库地址:

    maven { url uri("$rootDir/maven") }
    
  2. 在 App Module 目录的 build.gradle 中添加依赖。

2. 基础组件库

2.1 图片库

  1. 图片库 Glide 组件源码地址: https://github.com/bumptech/glide
  2. Glide Transformations 源码地址: https://github.com/wasabeef/glide-transformations
  3. Glide 图片原理
  4. 更多组件

Glide 图片加载缓存机制

image-20240711102039075

image-20240711102512132

image-20240717151059636

2.2 事件传递库

image-20240711105952717

image-20240711110243686

a. EventBus 集成使用

b. EventBus原理

2.3 适配器组件库

a. BaseRecyclerViewAdapterHelper使用

b. BaseRecyclerViewAdapterHelper基本原理

2.4 刷新库

  1. SwipeRefreshLayout组件使用
  2. PullToRefresh组件原理解析

2.5 更多组件库

UI组件 描述 UI组件 描述
SmartRefreshLayout 支持下拉刷新、上拉加载 BaseRecyclerViewAdapterHelper 灵活的RecyclerAdapter
TwinklingRefreshLayout 支持下拉刷新和上拉加载 Android-PickerView 选择器
SwipeBackLayout 支持手滑滑动返回 TitleBar 标题栏框架
CoordinatorTabLayout 配合TabLayout折叠控件 ToastUtils 各种聚集杂项
FlowLayout Android Android流式布局 Toasty 自定义Toast库
ShimmerRecyclerView 数据加载闪烁效果 banner 轮播图

动画

动画库 描述
lottie json动画库
AVLoadingIndicatorView load动画库

数据库

数据库库 描述
greendao 将对象映射的SQLite的ORM解决方案库
litepal 对象关系映射 (ORM) 模型
afinal 开源的android的Orm和Ioc应用开发框架,小巧灵活,代码优雅
objectbox 基于IoT为嵌入和移动设备打造出的非常快速的面向对象的数据库库
Room Google推出的官方数据库框架
realm 移动端数据库,替代SQLite & ORMs

事件传递

事件传递库 描述
eventbus 在activities, fragments, threads, services之间传递消息
rxbus 简易的非反射的事件总线库

网络请求

网络请求库 描述
okhttp 安卓端最火热的网络请求库,使用简单,功能完备
volley 网络请求库,适合数据量不大,通信频繁的网络操作
retrofit 基于okhttp封装的网络库

JSON解析

JSON解析库 描述
fastjson Java语言编写的高性能功能完善的JSON库
gson Java序列化反序列化库用于JSON和Java对象转化
moshi 面向Android, Java 和Kotlin的现代JSON库
Jackson Java JSON库

热修复

热修复库 描述
tinker 腾讯热修复解决方案库
robust 美团热修复框架

注解框架

注解框架库 描述
butterknife View, Resource注入框架
dagger 依赖注入库

性能优化

性能优化库 描述
leakcanary 内存泄漏检测库
blockcanary 卡顿检测
arca 应用崩溃报告

组件化

组件化库 描述
arouter App进行组件化改造的路由框架

响应式

响应式库 描述
rxjava 响应式编程,创建基于事件的异步操作库
rxandroid RxJava的Android绑定

动画

  1. : Lottie 动画库的优点是什么?它是如何工作的?

    • 答: Lottie 是一个强大的动画库,支持在 Android、iOS 和 Web 上渲染 Adobe After Effects 动画。它的主要优点包括:
      • 跨平台支持: 一次创建,随处使用。
      • 高性能: 通过 JSON 文件渲染动画,比传统帧动画更高效。
      • 易于使用: 只需几行代码即可加载并播放动画。 Lottie 工作原理是通过解析由 Bodymovin 导出的 JSON 文件,并将其转换为原生的动画效果。
  2. : 如何在 Android 项目中集成 AVLoadingIndicatorView?

    • 答: 在 Android 项目中集成 AVLoadingIndicatorView 可以按照以下步骤进行:

      1. 在项目的

        文件中添加依赖:

        implementation 'com.wang.avi:library:2.1.3'
        
      2. 在布局文件中添加 AVLoadingIndicatorView:

        <com.wang.avi.AVLoadingIndicatorView
            android:id="@+id/avi"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:indicatorName="BallPulseIndicator"/>
        
      3. 在代码中启动或停止动画:

        AVLoadingIndicatorView avi = findViewById(R.id.avi);
        avi.show(); // To start animation
        avi.hide(); // To stop animation
        

数据库

  1. : Room 数据库有哪些主要特性?
    • 答: Room 是 Google 推出的官方数据库库,主要特性包括:
      • 简单易用: 使用注解来定义数据库表和查询。
      • 编译时验证: Room 在编译时验证 SQL 查询语句的正确性。
      • 与 LiveData 和 RxJava 集成: 支持与 LiveData 和 RxJava 集成,实现数据的异步处理和响应式编程。
      • 迁移支持: 提供了方便的数据库迁移机制。
  2. : 对比 SQLite、Realm 和 ObjectBox,有哪些不同点?
    • 答:
      • SQLite: 原生支持,轻量级,广泛应用,但需要手动管理数据库和查询。
      • Realm: 高性能,简单易用,支持实时更新,但库体积较大,使用时需要注意许可证问题。
      • ObjectBox: 高性能,简易的对象关系映射,适用于物联网和移动设备,但相对较新,社区支持可能不如前两者。

事件传递

  1. 问: EventBus 和 RxBus 有什么区别?
    • 答:
      • EventBus: 简单易用,基于发布-订阅模式,适用于组件间的简单通信。
      • RxBus: 基于 RxJava 实现的事件总线,支持复杂的事件流处理和异步操作,适合需要响应式编程的场景。

网络请求

  1. 问: Retrofit 是如何简化网络请求的?
    • 答: Retrofit 是一个基于 OkHttp 的网络请求库,通过注解和接口定义 API,简化了网络请求的处理。主要优点包括:
      • 类型安全: 自动将 JSON 响应解析为指定的 Java 对象。
      • 简洁的 API 定义: 通过注解定义请求方法和参数。
      • 与 OkHttp 集成: 支持 OkHttp 的所有特性,如拦截器和缓存。
      • 扩展性强: 支持自定义转换器和适配器,如 Gson、Moshi 和 RxJava。

JSON解析

  1. 问: Gson 和 Moshi 有什么区别?
    • 答:
      • Gson: 由 Google 开发,稳定且广泛使用,支持复杂的数据结构和自定义序列化/反序列化。
      • Moshi: 由 Square 开发,现代化设计,支持 Kotlin 特性(如 Kotlin 类型和不可变数据类),性能更高,错误处理更友好。

性能优化

  1. 问: LeakCanary 是如何帮助检测内存泄漏的?
    • : LeakCanary 是一个内存泄漏检测库,通过监控对象的生命周期来检测内存泄漏。当检测到内存泄漏时,会生成详细的泄漏路径报告,帮助开发者快速定位和修复内存泄漏问题。

响应式

  1. 问: RxJava 的核心思想是什么?如何在 Android 中使用 RxJava?

    • 答: RxJava 的核心思想是响应式编程,通过 Observable 和 Observer 进行事件流处理。它允许开发者以声明性方式处理异步事件和数据流。使用 RxJava 可以简化异步操作,避免回调地狱。在 Android 中使用 RxJava,可以通过以下步骤:

      1. 添加依赖:

        implementation 'io.reactivex.rxjava3:rxjava:3.0.0'
        implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
        
      2. 创建 Observable 和 Observer:

        Observable<String> observable = Observable.just("Hello, RxJava");
        Observer<String> observer = new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {}
        
            @Override
            public void onNext(String s) {
                Log.d("RxJava", s);
            }
        
            @Override
            public void onError(Throwable e) {}
        
            @Override
            public void onComplete() {}
        };
        observable.subscribe(observer);
        

image-20240711135100875

image-20240711135459810

image-20240711135547618

image-20240711135844682

image-20240711140054537

image-20240717151318752

image-20240711144157423

image-20240711150714715

image-20240711154107943

https://cdn.jsdelivr.net/gh/kennems/blog-image/image-20240711154107943.png

image-20240711154122463

image-20240711154137894

image-20240711154221250

image-20240711165040471

image-20240711154320479

image-20240711163723730

image-20240717152107549

image-20240717152153556

image-20240717152353344

image-20240711164017089

image-20240711164215353

image-20240711164308168

v

image-20240711164454139

image-20240711164737517

image-20240711164818076

image-20240711164942903

image-20240711165220231

image-20240711165452458

image-20240711165527198

image-20240711165535031

image-20240711165540941

image-20240711165621322

image-20240711165652791

对方正在输入… 2024/7/11 14:43:38
implementation 'io.github.cymchad:BaseRecyclerViewAdapterHelper:3.0.14'

对方正在输入… 2024/7/11 15:52:47
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.0.0")

对方正在输入… 2024/7/11 16:55:18
BaseMultiItemQuickAdapter

对方正在输入… 2024/7/11 16:55:33
SwipeRefreshLayout

对方正在输入… 2024/7/11 16:56:01
EventBus.getDefault().post

对方正在输入… 2024/7/11 16:56:14
Glide.with