RxJava订阅服务主题

时间:2017-04-18 16:34:33

标签: android android-service rx-java rx-android

我创建了一个简单的IntentService来将文件和一些数据上传到服务器。我希望能够在上传完成时显示Toast,但我需要在主线程上才能这样做。

由于我将RetroFit与RxJava结合使用来处理实际请求,我认为我应该使用observeOn(AndroidSchedulers.mainThread())方法在主线程上创建Toast。问题是(因为服务器)我可能不得不重新发送请求,在这种情况下我必须再次调用postRequest()方法。

然后这个新请求现在在主线程上。因此,为了避免我使用subscribeOn(Schedulers.io())方法,但这似乎是浪费,考虑到Service已经在它自己的线程上。

有没有办法指定Observable应该subscribeOn() Service个帖子?或者我应该只是Service而不是IntentService的子类并使用io线程?

private void postRequest(String title, LatLng location,
                         String description, MultipartBody.Part attachment) {
    mNetworkService.postRequest(title, location.latitude, location.longitude,
            description, attachment).subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(response -> {
                if (response.status() == 1) {
                    ToastUtil.makeText(getApplicationContext(), "Request Sent");
                    stopSelf();
                } else {
                    postRequest(title, location, description, attachment);
                }
            });
}

2 个答案:

答案 0 :(得分:3)

我不确定使用repainted是我自己如何解决这个问题,但在Rx中使用它的线程肯定是可能的。

IntentService使用Looper来完成其工作。如果您实际查看IntentService内部,您可以看到它实际上是从主线程循环器创建调度程序。您要做的是从IntentService Looper创建一个调度程序。

您可以使用以下方式执行此操作:

AndroidSchedulers.mainThread()

然后你可以这样做:

Scheduler intentScheduler = AndroidSchedulers.from(Looper.myLooper());

.observerOn(intentScheduler)

它应该使用IntentService的线程

答案 1 :(得分:1)

不确定我是否遗漏了某些内容,但为什么不在订阅“烤面包机”之前过滤流?即按response.status()过滤流。如果成功,它们可以立即传递到烤面包机,否则它们会再次发送。

这可能会在您返回主线程之前发生,因此您无需从那里重新发送。