阅读Google的Architecture Component的sample。
GitHub地址
Google的Architecture Component的架构说明参考开发Guide
Android应用架构指南

1、在Activity里只持有Model,不进行任何数据操作
//ViewModelProvider会生成Model,或给一个已经存在的Model
wordViewModel = ViewModelProvider(this).get(WordViewModel::class.java)
//Model返回LiveData,观测后一旦发生变化会回调,然后给Adpater
wordViewModel.allWords.observe(this, Observer { words ->
// Update the cached copy of the words in the adapter.
words?.let { adapter.setWords(it) }
})
...
//获得新的数据时通知Model
intentData?.let { data ->
val word = Word(data.getStringExtra(NewWordActivity.EXTRA_REPLY))
wordViewModel.insert(word)
Unit
}
2、Model里不持有View,负责从Repository里获取数据,然后用LiveData把数据变化通知到View,不直接操作数据
//生成Repository,用RoomDatabase生成Dao。实际上数据除了来自Room,还会来自网络、内存、sdcard等
val wordsDao = WordRoomDatabase.getDatabase(application, viewModelScope).wordDao()
repository = WordRepository(wordsDao)
//LiveData来自Repository
allWords = repository.allWords
...
//利用了ViewModel提供的协程viewModelScope,将数据操作放在协程里,不能在主线程做
fun insert(word: Word) = viewModelScope.launch {
repository.insert(word)
}
3、Repository
里面通过各种方式获得数据,这里获取到LiveData。可以通过数据库Room获得,也可以通过网络获取,也可以通过缓存获取。
//这里简单的利用Room获取LiveData,用Dao插入数据
val allWords: LiveData<List<Word>> = wordDao.getAlphabetizedWords()
suspend fun insert(word: Word) {
wordDao.insert(word)
}
4、Room数据库RoomDatabase
抽象类RoomDatabase()的子类,也是个抽象类。不用实现,Room将自动实现。
//提供获取Dao的抽象接口
abstract fun wordDao(): WordDao
网友评论