Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何将异步任务/ rx java代码转换为rxjava2?

如何将异步任务/ rx java代码转换为rxjava2?
EN

Stack Overflow用户
提问于 2017-12-12 01:18:04
回答 3查看 1K关注 0票数 1

我尝试将下面的AsyncTask代码转换为Rxjava2,但显然Rxjava2不处理空值,因此我的应用程序崩溃。下面是我的AsyncTask代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                Set<Map.Entry<String, Participant>> entries = pool.entrySet();
                for (Map.Entry<String, Participant> entry : entries) {
                    Participant participant = entry.getValue();
                    participant.release();
                }
                return null;
            }

            @Override
            protected void onPostExecute(Void aVoid) {
                cb.event(new Spin.Event<Void>());
            }
        }.execute();

下面是转换成Rxjava (不是Rxjava2)的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 Observable.defer(new Func0<Observable<Void>>() {
        @Override
        public Observable<Void> call() {
            Set<Map.Entry<String, Participant>> entries = pool.entrySet();
            for (Map.Entry<String, Participant> entry : entries) {
                Participant participant = entry.getValue();
                participant.release();
            }
            return Observable.just(null);
        }
    }).doOnCompleted(new Action0() {
        @Override
        public void call() {
            cb.event(new Spin.Event<Void>());
        }
    })
    .subscribeOn(Schedulers.computation())
    .subscribe();

将其转换为Rxjava而不会在返回null时崩溃的最佳方法是什么?另外,相对于Rxjava2,.execute()是如何发挥作用的?我甚至不确定这在Rxjava中是否有效

这是崩溃日志:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FATAL EXCEPTION: RxComputationThreadPool-3

                                                                           io.reactivex.exceptions.OnErrorNotImplementedException: null ObservableSource supplied
                                                                               at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:704)
                                                                               at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:701)
                                                                               at io.reactivex.internal.observers.LambdaObserver.onError(LambdaObserver.java:74)
                                                                               at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeOnObserver.onError(ObservableSubscribeOn.java:63)
                                                                               at io.reactivex.internal.disposables.EmptyDisposable.error(EmptyDisposable.java:63)
                                                                               at io.reactivex.internal.operators.observable.ObservableDefer.subscribeActual(ObservableDefer.java:35)
                                                                               at io.reactivex.Observable.subscribe(Observable.java:10842)
                                                                               at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)
                                                                               at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:38)
                                                                               at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:26)
                                                                               at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                               at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:154)
                                                                               at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
                                                                               at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                                                                               at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                                                                               at java.lang.Thread.run(Thread.java:818)
                                                                            Caused by: java.lang.NullPointerException: null ObservableSource supplied
                                                                               at io.reactivex.internal.functions.ObjectHelper.requireNonNull(ObjectHelper.java:39)
                                                                               at io.reactivex.internal.operators.observable.ObservableDefer.subscribeActual(ObservableDefer.java:32)
                                                                               at io.reactivex.Observable.subscribe(Observable.java:10842) 
                                                                               at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96) 
                                                                               at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:38) 
                                                                               at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:26) 
                                                                               at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                                                                               at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:154) 
                                                                               at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269) 
                                                                               at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
                                                                               at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
                                                                               at java.lang.Thread.run(Thread.java:818) 
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-12 01:47:29

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Observable.defer(new Callable<ObservableSource<?>>() {
            @Override
            public ObservableSource<?> call() throws Exception {
                Set<Map.Entry<String, Participant>> entries = pool.entrySet();
                for (Map.Entry<String, Participant> entry : entries) {
                   Participant participant = entry.getValue();
                   participant.release();
                }
                return Completable.complete().toObservable();
            }
        }).doOnComplete(new Action() {
            @Override
            public void run() throws Exception {
                Log.d("Complete", "Complete");
            }
        })
            .subscribeOn(Schedulers.computation())
            .observeOn(AndroidSchedulers.mainThread()).subscribe();

这段代码也可以工作。调用subscribe()方法将启动作业。

票数 1
EN

Stack Overflow用户

发布于 2017-12-12 08:50:43

由于您没有要回发到主线程的值,因此可以使用Completable

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Completable.fromAction(() -> {
    Set<Map.Entry<String, Participant>> entries = pool.entrySet();
    for (Map.Entry<String, Participant> entry : entries) {
        Participant participant = entry.getValue();
        participant.release();
    }
})
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
    () -> {
         cb.event(new Spin.Event<Void>());
    }, 
    error -> { /* show error toast */ }
);
票数 2
EN

Stack Overflow用户

发布于 2017-12-20 08:21:47

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Observable.defer(new Callable<ObservableSource<?>>() {

 //This method is replacing doInBackground
        @Override
        public ObservableSource<?> call() throws Exception {  
            Set<Map.Entry<String, Participant>> entries = pool.entrySet();
            for (Map.Entry<String, Participant> entry : entries) {
               Participant participant = entry.getValue();
               participant.release();
            }
            return Completable.complete().toObservable();
        }
    }).doOnComplete(new Action() {
     //This is onPostExecute
        @Override 
        public void run() throws Exception {
            Log.d("Complete", "Complete");
        }
    })
        .subscribeOn(Schedulers.computation())
        .observeOn(AndroidSchedulers.mainThread()).subscribe()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47763987

复制
相关文章
Rx Java 异步编程框架
在很多软件编程任务中,或多或少你都会期望你写的代码能按照编写的顺序,一次一个的顺序执行和完成。但是在ReactiveX中,很多指令可能是并行执行的,之后他们的执行结果才会被观察者捕获,顺序是不确定的。为达到这个目的,你定义一种获取和变换数据的机制,而不是调用一个方法。在这种机制下,存在一个可观察对象(Observable),观察者(Observer)订阅(Subscribe)它,当数据就绪时,之前定义的机制就会分发数据给一直处于等待状态的观察者哨兵。
架构探险之道
2023/03/04
3.1K0
Rx Java 异步编程框架
java如何将String转换为enum
已知枚举对应的String值,希望得到对应的枚举值。例如,已知"A",希望得到对应的枚举——Blah.A,应该怎么做? Enum.valueOf()是否能实现以上目的,如果是,那我如何使用?
硬核编程
2020/07/23
3.9K0
Java 如何将 List 转换为 MAP
上面的代码将会把 Id 作为 Key,然后生成的 Map 是以 id 为 Key,Animal 为Value 的 Map。
HoneyMoose
2022/10/12
2K0
Java 如何将 List 转换为 MAP
java如何将String转换为Int
Short.valueOf/parseShort, Long.valueOf/parseLong等也是有类似差别。
硬核编程
2020/07/23
1.6K0
java中如何将数组转换为List
如何将其转换为ArrayList <Element> arraylist = ???
硬核编程
2020/07/23
3.1K0
Java 中如何将 String 转换为 Long
根据官方的说法为:如果输入的字符串为 null 或者 0 的话,将会有下面的返回和输出。
HoneyMoose
2022/01/06
2.8K0
Java 中如何将 String 转换为 Long
转:用 Async 函数简化异步代码
Promise 在 JavaScript 上发布之初就在互联网上流行了起来 — 它们帮开发人员摆脱了回调地狱,解决了在很多地方困扰 JavaScript 开发者的异步问题。但 Promises 也远非完美。它们一直请求回调,在一些复杂的问题上仍会有些杂乱和一些难以置信的冗余。
用户7293182
2022/01/20
6410
转:用 Async 函数简化异步代码
Continuation - 连接异步任务和同步代码
异步 Swift 代码需要能够和现有同步代码一起使用,这些同步代码使用 completion 回调或者 delegate 方法等技术来响应事件。在 continuations 上,异步任务可以挂起自身,同步代码能够捕获并调用 continuations 来恢复任务,响应事件。
DerekYuYi
2022/01/23
2.3K0
mysql整型转字符串_java中如何将字符串转换为字符数组
select * from A order by cast(name as unsigned);
全栈程序员站长
2022/09/27
23.3K0
如何将 Java 8 中的流转换为数组
最简单地方式就是使用 toArray(IntFunction<A[]> generator) 方法,该方法也是 Java API 所建议使用的方法,详情请戳
村雨遥
2022/06/15
3.9K0
java转python代码
今天发现一个好玩的工具:可以直接将java转成python 1. 安装工具(windows 环境下面) 先下载antlr: http://www.antlr3.org/download/antlr-3.1.3.tar.gz 链接:http://pan.baidu.com/s/1gdgXUM3 密码:2qrx 解压后,进入\antlr-3.1.3\runtime目录: python setup.py install
py3study
2020/01/07
5.5K0
java 代码转kotlin
今天看见IDEA 有一个快捷键 Ctrl+Alt+shift+K。 选中一段代码直接就能将java 代码转化为kotlin 代码。
地球流浪猫
2018/08/02
8670
java map 转string_java-将Map <String,Object>转换为Map <String,String>
Map map = new HashMap(); //Object is containing String
全栈程序员站长
2022/08/25
12.3K0
java 如何将异常Exception的信息转换为String
一般情况下,我们是通过log4j封装的api将异常打印到日志当中。 logger.error("error", e); 如果我们想在程序中获得该异常的详细信息,并输出到数据库中,我们可以这样做 StringWriter sw = new StringWriter(); try(PrintWriter pw = new PrintWriter(sw);){ e.printStackTrace(pw); } String errorInfo = sw.toString();
Theone67
2019/11/21
1.2K0
springBoot异步任务、异步监控
除了自己实现线程外,springBoot本身就提供了通过注解的方式,进行异步任务的执行。下面主要记录一下,在springBoot项目中实现异步任务,以及对异步任务进行封装监控。
xcbeyond
2020/04/02
1.2K0
springboot任务之异步任务
此时我们启动服务器,并输出localhost:8080/hello,会在3s之后响应的success。
西西嘛呦
2020/08/26
4420
将 async/await 异步代码转换为安全的不会死锁的同步代码
发布于 2018-03-16 03:58 更新于 2018-08-19 11:10
walterlv
2018/09/18
1.7K0
将 async/await 异步代码转换为安全的不会死锁的同步代码
java jsonobject转List_java – 将JSONObject转换为List或JSONArray的简单代码?「建议收藏」
我已经通过各种线程阅读并发现了类似的问题,但在找到解决我的特定问题的方法方面却相当不成功.
全栈程序员站长
2022/07/25
8.9K0
如何将ownCloud转换为Nextcloud
ownCloud的核心开发团队中一部分人员启动了一个名为Nextcloud的项目。虽然ownCloud将继续开发,但您可能想了解新项目的功能。Nextcloud和ownCloud共享一个公共代码库,这意味着将现有的ownCloud安装迁移到Nextcloud中。
小铁匠米兰的v
2018/08/02
2.6K0
SpringBoot异步任务
在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的;但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring 3.x之后,就已经内置了@Async来完美解决这个问题。
别团等shy哥发育
2023/02/25
3600
SpringBoot异步任务

相似问题

如何将我的代码转换为异步任务?

11

Android,java rx,异步

22

如何将其转换为异步任务?

11

Rx Java 2同步与异步

13

Java rx嵌套异步调用

132
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文