android项目实战 Android JetPack架构篇,一个实战项目带你学懂JetPack( 三 )


WordRoomDatabaSe db = WordRoomDatabaSe . GetDatabaSe(应用程序);
mWordDao = db . WordDao();
mall words = mworddao . getall words();
}
为getAllWords()添加一个包装器。Room在单独的线程上执行所有查询。观察到LiveData数据更改时,将通知观察者。LiveData&lt。列表&lt。Word & gt&gt。getAllWords() {
returnmAllWords
}
为insert()方法添加一个包装器。使用AsyncTask来执行,确保其是在非UI线程中执行。publicvoidinsert(Word word){
newInsertAsyncTask(mWordDao)。execute(word);
}
InsertAsyncTask的实现privatesticclassinsertasynctaskextendsasynctask & lt;单词,无效,无效>{
privateWordDao mAsyncTaskDao
insertAsyncTask(WordDao dao) {
mAsyncTaskDao = dao
}
@覆盖
protectedVoid doInBackground(最终单词...params){
masynctaskdao . insert(params[0]);
returnnull
}
}
以下是完整的代码:
publicclassWordRepository{
privateWordDao mWordDao
隐私数据&lt。列表&lt。Word & gt&gt。mAllWords
文字储存库(应用程序){
WordRoomDatabaSe db = WordRoomDatabaSe . GetDatabaSe(应用程序);
mWordDao = db . WordDao();
mall words = mworddao . getall words();
}
LiveData&lt。列表&lt。Word & gt&gt。getAllWords() {
returnmAllWords
}
publicvoidinsert(Word word){
newinsertAsyncTask(mWordDao)。execute(word);
}
privatesticclassinsertasynctaskextendsasynctask & lt;单词,无效,无效>{
privateWordDao mAsyncTaskDao
insertAsyncTask(WordDao dao) {
mAsyncTaskDao = dao
}
@覆盖
protectedVoid doInBackground(最终单词...params){
masynctaskdao . insert(params[0]);
returnnull
}
}
}
创建视图模型
什么是ViewModel?视图模型的目的是向用户界面提供数据并保存配置更改。视图模型充当存储库和用户界面之间的通信中心。您还可以使用视图模型在片段之间共享数据。视图模型是生命周期库库的一部分。

android项目实战 Android JetPack架构篇,一个实战项目带你学懂JetPack


文章图片

为什么使用ViewModel?当配置改变时,视图模型以生命周期感知的方式保存应用程序的用户界面数据。将一个应用程序的UI数据从Activity和Fragment类中分离出来,可以让你更好地遵循单一责任原则:你的Activity和Fragment负责将数据绘制到屏幕上,而ViewModel负责保存和处理UI所需的所有数据。
在视图模型中,对用户界面将使用或显示的变量数据使用实时数据。使用实时数据有几个优点:
您可以在数据上放置一个观察者(而不是轮询更改),并且只在数据实际更改时更新UI。Repository和UI由ViewModel完全分离。没有来自ViewModel的数据库调用,使得代码更易于测试。ViewModel的实现创建WordViewModel类,使其继承AndroidViewModel。publicClassWordViewModelExtendsandRoidViewModel { }
添加一个私有成员变量来保存对存储库的引用。private word repository mRepository;
添加一个私有LiveData成员变量来缓存单词列表。隐私数据&lt。列表&lt。Word & gt&gt。mAllWords
添加一个构造函数,该构造函数获取对存储库的引用,并从存储库获取单词列表。公共视图模型(应用程序应用程序){
super(应用);
mRepository = newWordRepository(应用程序);
mall words = mrepository . getall words();
}
为所有单词添加一个get方法。这完全隐藏了对UI的实现。LiveData&lt。列表&lt。Word & gt&gt。getAllWords(){ returnmalllwords;}
创建一个调用Repository的insert()方法的包装器insert()方法。这样,insert()的实现对于UI就完全透明了。public void insert(Word Word){ mrepository . insert(Word);}

推荐阅读