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的线程