谷歌最近宣布了新的WorkManager架构组件.通过WorkManager在doWork()课堂上实现,可以很容易地安排同步工作,但是如果我想在后台进行一些异步工作呢?例如,我想使用Retrofit进行网络服务调用.我知道我可以发出同步网络请求,但它会阻塞线程并且感觉不对.有没有解决方案,或者目前还不支持?
我是新架构组件WorkManager的新手,我通过Retrofit和RxJava进行API调用.
我的用例是从后端获取新帖子,然后显示通知,并更新小部件.
所以来自Worker类的doWork()方法中的代码可能看起来像这样.
@NonNull
@Override
public Result doWork() {
AppDependencies appDependencies = new AppDependencies((Application) getApplicationContext());
Repository repository = appDependencies.getRepository();
repository.getNewPosts()
.flatMap(newPosts -> repository.inserPosts(newPosts).toObservable())
.doOnError(Timber::e)
//if success - > return Result.SUCCESS,
// -> show notification
// -> update widget
// error-> return Result.Failure
.dontKnowWhatBestNextThing; //blocking or subscribing
//if we reached here then Retry
return Result.RETRY;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是在Worker类中使用RxJava代码的正确方法是什么,因为doWork()方法有一个返回值,所以我必须使Rx代码同步.
如果我使用非阻塞Rx方法,我怎样才能返回值(成功 - 失败 - 重试)
android rx-java2 android-architecture-components android-jetpack android-workmanager
我正在使用RXJava2在广播接收器中发送电子邮件,我想知道何时应该退订该事件。代码基本上是:
getSmsMmsObservable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnError(throwable -> Timber.e(throwable, "Error sending mail."))
.map(smsMmsAddress1 -> {
smsMmsAddress = smsMmsAddress1;
return doInBackgroundSendEmail();
})
.map(stringSingle -> {
mMsgResponse = stringSingle;
this.done = true;
return deleteFile();
})
.subscribe(success -> {
if (success) {
Toast.makeText(context, "Message Status: " + mMsgResponse, Toast.LENGTH_LONG).show();
}
});
Run Code Online (Sandbox Code Playgroud)
我什么时候退订(接收器中没有onPause或onDestroy),我怎么知道onReceive何时完成?接收者通过清单进行注册。我考虑过做一个可观察的复合物,然后在subscribe()部分中将其处理。
compositeDisposable.add(
getSmsMmsObservable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnError(throwable -> Timber.e(throwable, "Error sending mail."))
.map(smsMmsAddress1 -> {
smsMmsAddress = smsMmsAddress1;
return doInBackgroundSendEmail();
})
.map(stringSingle -> {
mMsgResponse = stringSingle;
this.done = true;
return deleteFile();
})
.subscribe(success -> …Run Code Online (Sandbox Code Playgroud)