android项目实战 Android JetPack架构篇,一个实战项目带你学懂JetPack( 三 )
WordRoomDatabaSe db = WordRoomDatabaSe . GetDatabaSe(应用程序);
mWordDao = db . WordDao();
mall words = mworddao . getall words();
}
为getAllWords()添加一个包装器。Room在单独的线程上执行所有查询。观察到LiveData数据更改时,将通知观察者。LiveData<。列表<。Word & 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
隐私数据<。列表<。Word & gt>。mAllWords
文字储存库(应用程序){
WordRoomDatabaSe db = WordRoomDatabaSe . GetDatabaSe(应用程序);
mWordDao = db . WordDao();
mall words = mworddao . getall words();
}
LiveData<。列表<。Word & 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?视图模型的目的是向用户界面提供数据并保存配置更改。视图模型充当存储库和用户界面之间的通信中心。您还可以使用视图模型在片段之间共享数据。视图模型是生命周期库库的一部分。
文章图片
为什么使用ViewModel?当配置改变时,视图模型以生命周期感知的方式保存应用程序的用户界面数据。将一个应用程序的UI数据从Activity和Fragment类中分离出来,可以让你更好地遵循单一责任原则:你的Activity和Fragment负责将数据绘制到屏幕上,而ViewModel负责保存和处理UI所需的所有数据。
在视图模型中,对用户界面将使用或显示的变量数据使用实时数据。使用实时数据有几个优点:
您可以在数据上放置一个观察者(而不是轮询更改),并且只在数据实际更改时更新UI。Repository和UI由ViewModel完全分离。没有来自ViewModel的数据库调用,使得代码更易于测试。ViewModel的实现创建WordViewModel类,使其继承AndroidViewModel。publicClassWordViewModelExtendsandRoidViewModel { }
添加一个私有成员变量来保存对存储库的引用。private word repository mRepository;
添加一个私有LiveData成员变量来缓存单词列表。隐私数据<。列表<。Word & gt>。mAllWords
添加一个构造函数,该构造函数获取对存储库的引用,并从存储库获取单词列表。公共视图模型(应用程序应用程序){
super(应用);
mRepository = newWordRepository(应用程序);
mall words = mrepository . getall words();
}
为所有单词添加一个get方法。这完全隐藏了对UI的实现。LiveData<。列表<。Word & gt>。getAllWords(){ returnmalllwords;}
创建一个调用Repository的insert()方法的包装器insert()方法。这样,insert()的实现对于UI就完全透明了。public void insert(Word Word){ mrepository . insert(Word);}
推荐阅读
- 张忠德、林定坤入选2021年岐黄学者支持项目
- 淮阳区召开乡村振兴示范村创建暨2022年农业产业项目座谈会
- 闵行推出的这个新项目,已覆盖20多所幼儿园,家长反馈良好
- 和平精英:首款特效平底锅的实战效果!颜值在线,氪度却不美丽!
- 《一梦江湖》金陵奇妙会上演精彩娱乐项目,吃货们别忘了参加
- 永兴县:3.5亿元乡村振兴项目成功签约
- 王者荣耀:顶级难度五大英雄,500场实战仅入门,会玩的很少
- 第四届“奇璞奖”评选启动,九大赛道全面检阅健康产业价值创新项目(附报名通道)
- 王者荣耀新英雄实战几百场只算是入门,这三位英雄你会做到吗
- 经验交流 | 竹基镇:突出党建引领 选好用活沪滇帮扶项目