RxJava 订阅服务线程
RxJava Subscribe On Service Thread
我创建了一个简单的 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);
}
});
}
不确定我是否遗漏了什么,但为什么不在使用 "toaster" 订阅之前过滤流? IE。按 response.status()
过滤流。如果成功,它们可以立即传递给烤面包机,否则它们会再次发送。
这可能发生在您 return 到主线程之前,因此您不必从那里重新发送它。
我不确定使用 IntentService
是我自己解决这个问题的方式,但肯定可以在 Rx 中使用它的线程。
IntentService
使用 Looper 来完成它的工作。如果您真的查看 AndroidSchedulers.mainThread()
内部,您会发现它实际上是从主线程循环器创建一个调度程序。您要做的是从 IntentService Looper 创建一个调度程序。
您可以使用:
Scheduler intentScheduler = AndroidSchedulers.from(Looper.myLooper());
那么你可以这样做:
.observerOn(intentScheduler)
或
.subscribeOn(intentScheduler)
并且应该使用IntentService的线程
我创建了一个简单的 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);
}
});
}
不确定我是否遗漏了什么,但为什么不在使用 "toaster" 订阅之前过滤流? IE。按 response.status()
过滤流。如果成功,它们可以立即传递给烤面包机,否则它们会再次发送。
这可能发生在您 return 到主线程之前,因此您不必从那里重新发送它。
我不确定使用 IntentService
是我自己解决这个问题的方式,但肯定可以在 Rx 中使用它的线程。
IntentService
使用 Looper 来完成它的工作。如果您真的查看 AndroidSchedulers.mainThread()
内部,您会发现它实际上是从主线程循环器创建一个调度程序。您要做的是从 IntentService Looper 创建一个调度程序。
您可以使用:
Scheduler intentScheduler = AndroidSchedulers.from(Looper.myLooper());
那么你可以这样做:
.observerOn(intentScheduler)
或
.subscribeOn(intentScheduler)
并且应该使用IntentService的线程