到目前為止已經完成整個Architecture Components架構及各區塊的test方法,今天做個小總結,回顧各個library使用上須注意的地方以及其他補充資訊。
適合用來儲存UI相關的資料,會參照Activity/Fragment的生命週期,每次重建時都能取得同一個ViewModel。
of()
裡的owner不要寫錯。onSaveInstanceState()
,當系統資源不足的時候ViewModel有可能被系統清除所以不能保證資料存在,可以兩者搭配使用,例如讓ViewModel儲存物件User,onSaveInstanceState()
儲存User id。android.*
的import(除了android.arch.*
以外)。持有資料並當View在前景時才會發送,避免memory-leak和找不到View時的意外crash。
setValue()
在UI thread執行,或用postValue()
在background thread執行。LiveData<Repo> repo = Transformations.switchMap(repoIdLiveData, repoId -> {
if (repoId.isEmpty()) {
return AbsentLiveData.create();
}
return repository.loadRepo(repoId);
}
);
作為trigger的repoIdLiveData更新時將觸發repository.loadRepo(repoId)
來更新repo。
建立抽象層包裝SQLiteDatabase,有效減少code量和建立object mapping。
@ForeignKey
讓更新和刪除時連動,或用@Relation
做關聯查詢。@TypeConverters
。Room.databaseBuilder(app, GithubDb.class,"github.db")
.addMigrations(MIGRATION_1_2)
.addCallback(new RoomDatabase.Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
// Insert data here.
}
})
.build();
<include>
合併layout時,給<include>
設置id就可以在java中用binding.<includeId>.xxx
取得其中的元件。=
。<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@={viewModel.password}" />
當使用者在EditText輸入文字時,password.get()
就能取得文字;同時,可以用password.set()
更新EditText的內容。
Lazy<>
包起來,在需要物件時才以get()
生成物件。private Lazy<User> user;
...
String name = user.get().name;
需特別注意首次呼叫get()
時便會將物件快取,之後每次get()
都會得到同一個快取的物件。
最後推薦這篇ViewModels and LiveData: Patterns + AntiPatterns,作者是Google工程師Jose,也是開發Architecture Components的成員之一。該篇不只是文章內容,底下的幾個問答對觀念釐清也很有用,這次鐵人的大綱就是受到Jose其中一個回應的啟發:
For an intermediate developer I would recommend:
MVVM + LiveData + Room (unit tests and Espresso are always mandatory)
Adopt Dagger2 when you need it.
Adopt RxJava2 when you reach the limitations of LiveData and want to make the rest of your app’s layers reactive.
(This is my personal opinion, not Google’s or the framework team’s)
明後天會看一下還在測試階段的Paging和Data Binding V2,剩餘幾天就留給Jose在最後提到的RxJava2。
Reference:
ViewModels and LiveData: Patterns + AntiPatterns
7 Pro-tips for Room