使用RxJAVA和DAO更新数据库插入的UI
我有一个使用RxJAVA和DAO更新数据库插入的UI,java,android,rx-java,Java,Android,Rx Java,我有一个ChatThreadsActivity(),它显示两个人之间的消息 每当用户打开活动时,我都会制作一个API来获取最近的100条消息。因此,在onCreate()方法中,我调用makeApiRequestToGetChatThread() 我知道我在这里做了很多错事 在onNext()内部,我向chatThreadAdapter添加行。我知道这是错误的,因为我在插入后更新了适配器 chatDaoObject.querychatsthreadsfromdb(someId).observeO
ChatThreadsActivity()
,它显示两个人之间的消息
每当用户打开活动时,我都会制作一个API来获取最近的100条消息。因此,在onCreate()
方法中,我调用makeApiRequestToGetChatThread()
我知道我在这里做了很多错事
onNext()
内部,我向chatThreadAdapter
添加行。我知道这是错误的,因为我在插入后更新了适配器chatDaoObject.querychatsthreadsfromdb(someId).observeOn(AndroidSchedulers.mainThread()).subscribe()
这应该匿名吗?什么时候会取消订阅private void MakeApiRequestToGetAtthreads(){
公共void onResponse(呼叫、最终响应){
final String responseString=response.body().String();
runOnUiThread(()->{
最终JSONArray数组=新JSONArray(responseString);
JSONObject对象;
for(int i=0;i
我使用RxJAVA和SQLBrite Dao,下面是查询的样子:
//In `ChatDao` class
ChatDataDao extends Dao {
...
...
public Observable<long> insertAChatInDB(JSONObject o) {
ChatThreadsTable.ContentValuesBuilder valuesBuilder = ChatThreadsTable.contentValues();
...
//populating columns values
...
return insert(ChatThreadsTable.TABLE_NAME, valuesBuilder.build(), SQLiteDatabase.CONFLICT_IGNORE);
}
public Observable<List> queryChatThreadsFromDB () {
return rawQuery("SELECT * FROM " + ChatThreadsTable.TABLE_NAME).run().mapToList(ChatObjectMapper.MAPPER);
}
...
...
}
//在'ChatDao'类中
ChatDataDao扩展了Dao{
...
...
公众可观察的insertAChatInDB(JSONObject o){
ChatThreadsTable.ContentValuesBuilder valuesBuilder=ChatThreadsTable.contentValues();
...
//填充列值
...
返回insert(ChatThreadsTable.TABLE\u NAME,valuesBuilder.build(),SQLiteDatabase.CONFLICT\u IGNORE);
}
公共可观察queryChatThreadsFromDB(){
返回rawQuery(“选择*自”+ChatThreadsTable.TABLE_NAME).run().mapToList(ChatObjectMapper.MAPPER);
}
...
...
}
编辑:
这是查询数据库而不必担心订阅/取消订阅的正确方法吗
rawQuery("SELECT * FROM " + SomeObject.TABLE_NAME + " ORDER BY " + SomeObject.COL1 + " , " +SomeObject.COL2 + " DESC").run().mapToList(SomeObjectMapper.MAPPER)
.flatMap(new Func1<List<SomeObject>, Observable<SomeObject>>() {
@Override
public Observable<SomeObject> call(List<SomeObject> SomeObjects) {
return Observable.from(SomeObjects);
}
}).doOnNext(new Action1<SomeObject>() {
@Override
public void call(SomeObject chatThreadObject) {
}
}).subscribe();
rawQuery(“从”+SomeObject.TABLE_NAME+”中选择*按“+SomeObject.COL1+”、“+SomeObject.COL2+”DESC”排序”).run().mapToList(SomeObjectMapper.MAPPER)
.flatMap(新函数1(){
@凌驾
公共可观察调用(列出一些对象){
从(某些对象)可观察到的返回;
}
}).doOnNext(新行动1){
@凌驾
公共void调用(SomeObject chatThreadObject){
}
}).subscribe();
这些教程告诉人们创建自己的订阅者是怎么回事?这是一个经过清理的版本:
private void makeApiRequestToGetChatThreads() {
// ... some call that calls back onResponse
}
public void onResponse(Call call, final Response response) {
// are you sure this is how you parse a JSON String?
Observable
.from(response.body().string())
.observeOn(Schedulers.computation())
.flatMapIterable(JsonArray::new)
.map(JSONObject::new)
.flatMap(chatDaoObject::insertAChatInDB)
.flatMap(chatDaoObject::queryChatThreadsFromDB)
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(chatThreadAdapter::addAllChatThreadsIntoList)
.subscribe(dummy -> {}, throwable -> {
e.printStackTrace();
Crashlytics.logException(e);
});
}
- 很可能有更好的方法可以直接让网络调用返回一个可观察的结果。检查您的文档/同行
- 当Observable完成所有处理和UI更新时,它将自行取消订阅。但是,如果网络呼叫需要一段时间才能完成,则用户可能已经切换了屏幕/应用程序,UI操作将中断您的应用程序。考虑在视图中保存订阅并取消订阅。提示:在
onResponse
中创建订阅是。。。不是最优的
- 您将获得100个线程,并为每个线程更新UI。你确定你想要吗
- 我不认为你需要关心背压
我们使用SQLBrite Dao,它将查询结果映射到一个对象,并返回Observable
。因为他们正在使用Observable.defer()
[定义:在观察者订阅之前,不要创建Observable
,并为每个观察者创建一个新的观察对象]。因此,为了实现这一点,我们必须在我们的活动中创建一个匿名订阅。取消订阅的最佳方式是什么?你没有。请参阅上面的代码片段。Dao给您一个发出单个项的可观察对象,然后它调用onComplete
。如果您使用flatMap
,它将负责订阅/项目生产/完成生命周期。我不明白订阅
在这里做什么。假人是做什么用的?第二个参数是错误处理程序,但什么是dummy
?一个伪参数-您不需要对项目执行任何操作,所有处理都已在上面的可观察链中完成,但为了方便访问错误处理程序,您需要提供一个值,因此我们提供一个不可操作的参数。请检查编辑。这是查询数据库的正确方法吗?
private void makeApiRequestToGetChatThreads() {
// ... some call that calls back onResponse
}
public void onResponse(Call call, final Response response) {
// are you sure this is how you parse a JSON String?
Observable
.from(response.body().string())
.observeOn(Schedulers.computation())
.flatMapIterable(JsonArray::new)
.map(JSONObject::new)
.flatMap(chatDaoObject::insertAChatInDB)
.flatMap(chatDaoObject::queryChatThreadsFromDB)
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(chatThreadAdapter::addAllChatThreadsIntoList)
.subscribe(dummy -> {}, throwable -> {
e.printStackTrace();
Crashlytics.logException(e);
});
}