android reactivex主题线程

时间:2017-09-22 08:23:01

标签: android rx-android reactivex

我正在使用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),但似乎observablesonNext调用需要在observable定义内。

1 个答案:

答案 0 :(得分:0)

我认为您可能会对Java中的选项感到困惑或不知道。您将任务或工作程序封装到一个对象(如Runnable)中并将其推送到另一个线程,而不是全局更改程序的线程,就像您所建议的那样。通过high-level concurrency的方式查看Java本身提供的内容。

在必要性方面,您也不需要切换到io线程。如果用数据库写入阻塞主线程的主要性能问题,那么无论如何。要考虑:这样的线程决定也可以依靠你的错误处理。例如,无法写入数据库的邮件是否仍会显示在msgDataList中?是msgDataList是否乐观地向观察者发出,或者等待数据库完成写作?

最后,要解决您的SubjectObservable问题:因为消息服务器位于Observable环境的最边缘,您或者服务器库的某些部分非常接近原始服务器数据流使用Subject将商品投放到Observable个链中。在您的情况下,您可以将其视为仅使用onSuccess接口Requester随着时间的推移填充onNext界面的Observable es,但您可以&#39;}使用能够获取原始数据的内容并在另一方使用Observable