专栏名称: Android_开发者
目录
相关文章推荐
51好读  ›  专栏  ›  Android_开发者

Android 架构组件的最新进展 (下篇)

Android_开发者  · 掘金  · android  · 2019-10-18 02:19

正文

阅读 224

Android 架构组件的最新进展 (下篇)

根据我们曾经做的调查,开发者们希望 Android 官方可以维护一些实用的组件库和架构实践,以降低中大型应用的开发门槛,这样开发团队就可以集中更多精力在实际业务的优化和改进上。

Jetpack 项目正是为了解决这些问题而诞生的,Jetpack 是一系列助力您更容易打造优秀 Android 应用的工具和组件,这些组件能帮助您遵循最佳实践、免除编写繁复的样板代码并简化复杂任务,从而使您可以专注于最核心的代码逻辑。其中 androidx.* 库与 Framework API 解耦,这能够提供向后兼容的同时,也能更频繁地更新。

Android Jetpack 中的 架构组件 可帮助您设计稳健、可测试且易维护的应用。从最初发布的管理 Activity 和 Fragment 生命周期的 Lifecycle 库 和访问 SQLite 数据库的 Room 库 ,后来推出了 分页 (Paging) 导航 (Navigation) 和管理后台任务的 WorkManager 库 。根据 2019 年最新的开发者调查中,70% 以上的专业开发者用过这五个库当中的至少一个库进行应用开发。

这里我们分上下两篇介绍 架构组件 的最新更新,如果您还没有阅读本文的上篇,请点击这里查看 《Android 架构组件的最新进展 (上篇) 》。本篇将会继续为大家介绍分页库、Room 持久性库和 WorkManager。希望大家能在其中发现对自己的应用有帮助的全新功能以及改进:

分页库

Paging (分页) 使得开发者可以逐步、高效地加载大量数据,从而节省用户的电池和流量。而且它和架构组件中的其他部分或者其他技术都能配合使用,比如 Room, Realm, Retrofit 等等。

为了让分页的使用更加便捷,在不久未来的版本里我们将提供:

  • 内置的网络支持,而且提供错误处理机制
  • Header 和 Footer 支持
  • 更好的 RxJava 支持以及协程的集成

Room 持久性库

Room 是一个在 SQLite 上提供抽象层的持久存储库,您可以回顾 我们之前的介绍文章 了解更多 Room 的详细信息。

协程处理

在 Room 2.1 中,开发者可以通过 Kotlin 语言的 suspend 关键字让 Room 生成正确的协程代码,包括使用后台 dispatcher,这大大降低了开发者处理协程的工作量:

// Room 2.1

@Query("SELECT * FROM song WHERE songId = :songId")
suspend fun getSong(songId: String): Song

@Insert
suspend fun insertSong(song: Song)

@Transaction
suspend fun deleteShortSongs(): List<Song> {
    val songs = getSongsWithElapsedTimeLessThan(1000)
    deleteSongsWithIds(songs.map { it.songId })
    return songs
}
复制代码

另外,在 Room 2.1 中也提供了扩展函数让开发者方便地启动事务。它还会提供一个协程上下文 (CoroutineContext),这样开发者可以更方便地执行多个数据库操作:

database.withTransaction {
    val songs = getSongsWithElapsedTimeLessThan(1000)
    deleteSongsWithIds(songs.map { it.songId })
    return songs
}
复制代码

全文搜索

全文搜索功能是对 SQLite 的一个扩展,让其创建一个数据表从而更高效地检索数据。

在 Room 2.0 中,一个 Dao 的检索方法看起来可能是这样:

// Room 2.0

@Dao
interface SongDao {
    @Query("""
        SELECT *
        FROM Song
        WHERE songName LIKE ‘%’ || :query || ‘%’
        OR albumName LIKE ‘%’ || :query || ‘%’
        OR artistName LIKE ‘%’ || :query || ‘%
        """)
    fun searchSongs(query: String): List<Song>
}
复制代码

△ 注意 WHERE 和 OR 语句的长度

而在 2.1 中,只需要加入一个 @Fts4 注解,就可以通过 MATCH 语句让一切都轻松很多:

// Room 2.1

@Entity
@Fts4
data class Song(
    @PrimaryKey
    @ColumnInfo(name = "rowid")
    val id: Long,
    val url: String,
    val songName: String,
    val albumName: String,
    val artistName: String
)

@Dao
interface SongDao {
    @Query("""
        SELECT *
        FROM Song
        WHERE Song MATCH :query
        "






请到「今天看啥」查看全文