我正在使用reactivex android作为我的聊天应用程序。我有以下代码段:
class ServerHelper {
public static void requestNewMessages(Time after) {
Requester<Message> req = new Requester<>(after) {
public void onSuccess(List<Message> msgs) {
// I think it's on main thread now, right?
DBHelper.storeMessages(msgs);
}
}
}
}
class DBHelper {
public static PublishSubject<List<MessageData>> subject = PublishSubject<>.create();
public static void storeMessages(List<Message> msgs) {
// Now do I need to switch to io thread? How
List<MessageData> msgDataList = new ArrayList<>();
for (Message msg : msgs) {
MessageData msgData = msg.saveToDB();
msgDataList.add(msgData);
}
// Now do I need to switch back to main thread?
subject.onNext(msgDataList);
}
}
class MyFragment implements Observer<List<MessageData>> {
private MessageData newestMessage;
private RecyclerView recyclerView;
public void onReceivedNewMessageNotification() {
// it's ok for us to be on main thread here, right? since the call is async
ServerHelper.requestNewMessages(newestMessage.time);
}
public void onResume() {
super.onResume();
DBHelper.subject.subscribe(this);
}
public void onNext(List<Message> data) {
// is it on main thread now?
recyclerViewAdapter.setData(data);
recyclerView.reloadData();
}
}
基本上我使用观察者模式制作聊天应用程序。当用户收到新消息通知时,我想通过ServerHelper
发送服务器请求,并在成功回调中,我致电DBHelper
&#39; s storeMessage
,通知主题。
我在代码中留下了一些评论。我担心线程切换的东西。我是否需要在io
调用开始时切换到storeMessages
线程,并在io完成后切换回main
线程?
另一个问题是,我在这里使用subject
还是observable
?哪一个更好?我知道subject
,我们可以直接致电subject.onNext(msgs)
,但似乎observables
,onNext
调用需要在observable
定义内。
答案 0 :(得分:0)
我认为您可能会对Java中的选项感到困惑或不知道。您将任务或工作程序封装到一个对象(如Runnable
)中并将其推送到另一个线程,而不是全局更改程序的线程,就像您所建议的那样。通过high-level concurrency的方式查看Java本身提供的内容。
在必要性方面,您也不需要切换到io线程。如果用数据库写入阻塞主线程的主要性能问题,那么无论如何。要考虑:这样的线程决定也可以依靠你的错误处理。例如,无法写入数据库的邮件是否仍会显示在msgDataList
中?是msgDataList
是否乐观地向观察者发出,或者等待数据库完成写作?
最后,要解决您的Subject
与Observable
问题:因为消息服务器位于Observable环境的最边缘,您或者服务器库的某些部分非常接近原始服务器数据流已使用Subject
将商品投放到Observable
个链中。在您的情况下,您可以将其视为仅使用onSuccess
接口Requester
随着时间的推移填充onNext
界面的Observable
es,但您可以&#39;}使用能够获取原始数据的内容并在另一方使用Observable
。