美文网首页
Architecture Component

Architecture Component

作者: Lucky胡 | 来源:发表于2019-11-05 12:51 被阅读0次

阅读Google的Architecture Component的sample。
GitHub地址

Google的Architecture Component的架构说明参考开发Guide
Android应用架构指南

APP架构

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

相关文章

网友评论

      本文标题:Architecture Component

      本文链接:https://www.haomeiwen.com/subject/lemsbctx.html