Android RxJava在服务线程上订阅

Android RxJava在服务线程上订阅,android,android-service,rx-java,rx-android,Android,Android Service,Rx Java,Rx Android,我创建了一个简单的IntentService,将一个文件和一些数据上传到服务器。上传完成后,我希望能够显示Toast,但我需要在主线程上才能这样做 由于我将改型与RxJava结合使用来处理实际请求,因此我认为应该使用observeOn(AndroidSchedulers.mainThread())方法在主线程上创建Toast。问题是(由于服务器原因),我可能必须重新发送请求,在这种情况下,我必须再次调用postRequest()方法 然后这个新请求现在在主线程上。因此,为了避免使用subscri

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

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

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

有没有办法指定
可观察的
应该
subscribeOn()
服务
线程?或者我应该只将
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);
                }
            });
}

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


这可能发生在您返回到主线程之前,因此您不必从那里重新发送它。

不确定我是否错过了那里的内容,但是为什么不在使用“toaster”订阅之前过滤流呢?即,通过
response.status()
过滤流。如果成功,它们可以立即传递到烤面包机,否则它们会再次被发送


这可能发生在您返回到主线程之前,因此您不必从那里重新发送它。

我不确定我自己会如何使用
IntentService
,但在Rx中使用它的线程肯定是可能的

IntentService
使用活套执行其工作。如果您实际查看一下
AndroidSchedulers.mainThread()
,您可以看到它实际上是在从主线程循环器创建一个调度程序。您要做的是从IntentService Looper创建一个调度程序

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

Scheduler intentScheduler = AndroidSchedulers.from(Looper.myLooper());
然后你可以做:

.observerOn(intentScheduler)


它应该使用IntentService的线程

我不确定我自己会如何使用
IntentService
,但在Rx中使用它的线程肯定是可能的

IntentService
使用活套执行其工作。如果您实际查看一下
AndroidSchedulers.mainThread()
,您可以看到它实际上是在从主线程循环器创建一个调度程序。您要做的是从IntentService Looper创建一个调度程序

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

Scheduler intentScheduler = AndroidSchedulers.from(Looper.myLooper());
然后你可以做:

.observerOn(intentScheduler)

它应该使用IntentService的线程