Android 架構組件的最新進展 (上篇)

根據咱們曾經作的調查,開發者們但願 Android 官方能夠維護一些實用的組件庫和架構實踐,以下降中大型應用的開發門檻,這樣開發團隊就能夠集中更多精力在實際業務的優化和改進上。html

Jetpack 項目正是爲了解決這些問題而誕生的,Jetpack 是一系列助力您更容易打造優秀 Android 應用的工具和組件,這些組件能幫助您遵循最佳實踐、免除編寫繁複的樣板代碼並簡化複雜任務,從而使您能夠專一於最核心的代碼邏輯。其中 androidx.* 庫與 Framework API 解耦,這可以提供向後兼容的同時,也能更頻繁地更新。java

Android Jetpack 中的架構組件可幫助您設計穩健、可測試且易維護的應用。從最初發布的管理 Activity 和 Fragment 生命週期的Lifecycle 庫和訪問 SQLite 數據庫的 Room 庫,後來推出了 分頁(Paging)導航(Navigation) 和管理後臺任務的 WorkManager 庫android

根據 2019 年最新的開發者調查中,70% 以上的專業開發者用過這五個庫當中的至少一個庫進行應用開發,接下來咱們將用上、下兩篇文章爲你們介紹 Android 架構組件的最新更新:數據庫

數據綁定庫

數據綁定 (Data Binding) 庫是一種支持庫,藉助該庫,您可使用聲明性格式 (而非程序化地) 將佈局中的界面組件綁定到應用中的數據源。數據綁定能夠理解爲代碼和 XML 標記語言之間的橋樑。緩存

更快的編譯速度安全

對開發者來講,處理界面中的數據綁定須要的時間成本不容忽視,咱們如今將數據綁定註解處理的速度提升了 20%*。bash

  • Google 內部實測結果。

若是您的工做涉及到協同開發,還有一個好消息,那就是咱們增長了對分佈式構建緩存的支持。網絡

最後,數據綁定支持增量註解處理,能提高增量構建的性能。但這個功能還停留在測試階段,因此請在 Gradle 配置文件中使用以下代碼手動打開:架構

android.databinding.incremental = true
複製代碼

和 Android Studio 更緊密地集成app

實時生成類代碼

如今,給視圖中的某個控件賦予 ID, 它就會在綁定的類中成爲一個可用的字段。或者直接在 XML 中設置一個變量,並在視圖中訪問,代碼也能立刻給出對應的提示。這些都即時可用,無需編譯!

更好地支持重構

在 IDE 裏使用重構的方式修改函數名稱以後,XML 中會同步進行更新。

更好用的報錯信息

數據綁定出錯的信息可能一會兒跳出來 1,000 條,這種尷尬將成爲過去。如今在構建輸出信息窗口中,數據綁定錯誤單獨成組,這樣開發者能更輕鬆地找到本身須要處理的錯誤信息。

有沒有更好的視圖訪問方式?

視圖訪問方法固然不止一種,但正如上圖所示的,在簡明、編譯安全和編譯速度上,各個方法總有取捨。那有沒有一種方法能一石 "三" 鳥呢?

即將到來!視圖綁定 (View Binding)

給出 ID 便可自動生成綁定類代碼且能保證編譯安全,能作到一石 "三" 鳥的視圖綁定可在 Android Studio 3.6 Canary 11 或更新版本中用得上。

<!-- profile.xml -->
<LinearLayout>
    <TextView android:id="@id/title"/>
    <ImageView android:id="@id/photo"/>
</LinearLayout>



class ProfileActivity:AppCompatActivity {
    override fun onCreate(savedInstanceState:Bundle?) {
        val binding = ProfileBinding.inflate(layoutInflater)
        setContentView(binding.root)
        // binding.title:TextView
        // binding.photo:ImageView
    }
}
複製代碼

△ 在生成的綁定類 inflate 以後,便可運行 setContentView,若是綁定的某個類型的控件不存在則沒法編譯。是時候告別 findViewById 了

全部的這些綁定類均由 Gradle 插件生成,若是開發者修改了某個佈局文件,會報錯的也會只有這個文件,100% 編譯安全。

處理生命週期

"ViewModel 和 SavedState 同樣嗎?ViewModel 會破壞 SavedState 嗎?" ——不少開發者會這麼問

基本上,開發者會經過 ViewModel 或着 SavedState 來保存本身的內容/狀態,當應用配置發生變化時再從 ViewModel 或者 SavedState 中取回保存的內容/狀態:

若是隻這樣粗略地理解的話,ViewModel 和 SavedState 實際上是一回事。然而並非這樣的。

SavedState 會經由 System Server (一個獨立的進程) 保存內容 (序列化的數據),也就是說,它會無視進程的限制。

而 ViewModel 則一直運行於進程內,即使應用配置發生變化,只要進程還在,ViewModel 保存的內容就不會消失。但只要進程消失,ViewModel 裏的內容也會消失。

ViewModel 用於:

  • 保留應用對網絡、數據庫的請求
  • 看成大型對象的緩存

SavedState 用於:

  • UI 的狀態記錄,好比選擇區域和滾動距離等
  • 導航狀態鍵值記錄

各取所長,聯手打造流暢體驗

// SavedStateHandle
class UserViewModel(val handle: SavedStateHandle) : ViewModel() {
}
複製代碼

如今用戶的 ViewModel 會在構造函數中接收一個 SavedStateHandle,這樣開發者就能在 ViewModel 中立刻訪問 SavedState。

而這個 SavedStateHandle 內部的邏輯也很是直白: 一個 Map 類的鍵值結構。固然,也提供了 LiveData 供訪問,只不過在這裏使用的是 MutableLiveData (由於 SavedState 是可變的)。

// map-like object
val handle : SavedStateHandle

// read
val myValue : Int = handle.get("key")

// write
handle.put("key", newValue)

// or
val liveData : MutableLiveData<Int> = handle.getLiveData("key")

// observe as usual
liveData.observe (lifecycleOwner) { value -> }

// write
liveData.value = newValue
複製代碼

更 Kotlin 友好的代碼

咱們會持續確保 Kotlin 語言的首選開發語言地位。其中一個例子就是 liveData.observe 如今支持 lambda 表達式:

// lifecycle-livedata-ktx

liveData.observe(lifecycleOwner) { newValue ->
}
複製代碼

另外一個例子則是 LiveData 再也不須要使用靜態的 Transformations.map 方法:

// lifecycle-livedata-ktx

// 之前
val mapped = Transformations.map(liveData) {
    user -> user.name 
}

// 如今
val mapped = liveData.map { user -> user.name }
複製代碼

ViewModel 的初始化也大幅精簡,之前您可能須要這麼操做:

// ViewModels initialization

lateinit var userViewModel: UserViewModel

fun onCreate(bundle: Bundle?) {
    userViewModel = ViewModelProviders.of(this)
        .get(UserViewModel::class.java)
}
複製代碼

而如今只須要一行:

// ViewModels initialization

val userViewModel: UserViewModel by viewModels()
複製代碼

導航

導航 (Navigation) 是一套管理應用內 UI 流程的 Jetpack 代碼庫,現已發佈了 2.1 的穩定版,與此同時下一個版本也已經出如今了不遠的前方,接下來咱們會:

  • 在導航中提供成組 (Scoped) ViewModel,好比一套登陸流程的界面集合就能夠用一個
  • ViewModel 來管理
  • 使用 URI 直接導航
  • 對話框能夠作爲導航目標
  • 更好地對動態功能作出支持

請你們保持對本次連載的關注,咱們會在下篇中爲你們介紹分頁庫、Room 持久性庫和 WorkManager 的更新進展。您也能夠觀看 ☟下面的視頻☟ 重溫咱們對架構組件進展的介紹。

騰訊視頻連接: v.qq.com/x/page/g300…

Bilibili 視頻連接: www.bilibili.com/video/av711…

但願在瞭解完架構組件的最新進展後,你們能在其中找到適合本身應用的功能。若是對架構組件有疑問或者建議,歡迎在評論區和咱們分享。

點擊這裏進一步瞭解 Android Jetpack

相關文章
相關標籤/搜索