android - 如何在 RxJava2 (Android) 中创建一个没有输入值但会生成一个字符串的流?

标签 android rx-java reactive-programming rx-java2

在 Android 中,我想在单独的线程(IO 线程)上调用 AdvertisingIdClient.getAdvertisingIdInfo(getContext()).getId() 并在主线程上处理字符串。

我不想用 RxJava2 做这个。 这就是我现在拥有的:(有效)

SingleOnSubscribe<String> source = new SingleOnSubscribe<String>() {
        @Override
        public void subscribe(SingleEmitter<String> e) throws Exception {
            e.onSuccess(AdvertisingIdClient.getAdvertisingIdInfo(getContext()).getId());
        }
    };

    Single.create(source)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .doOnError(new Consumer<Throwable>() {
                @Override
                public void accept(Throwable throwable) throws Exception {
                    Timber.e(throwable.getMessage());
                }
            })
            .subscribe(new Consumer<String>() {
                @Override
                public void accept(String s) throws Exception {
                    advertisingId = s;
                }
            });

我更喜欢的是,这纯粹是品味,如果我可以“只是”创建流并在方法流中处理它。如:(警告, super 伪代码)

Completable
    .empty()
    .produce(() -> String {
        return makeString();
    })
    .sub/obs-On()...
    .subscribe(coolString -> {mVariable = coolString})

所以,创建一个 Observable 并通过执行一些函数将其变成一个 Observable。

最佳答案

像这个例子一样使用 defer 或 fromCallable:

Observable<String> stringObservable = Observable.fromCallable(() -> {
        return getStuff();
    });

测试

@Test
public void fromCallable() throws Exception {
    Observable<String> stringObservable = Observable.fromCallable(() -> {
        return getStuff();
    });

    ExecutorService executorService = Executors.newSingleThreadExecutor(runnable -> {
        return new Thread(runnable, "myFancyThread");
    });
    Scheduler scheduler = Schedulers.from(executorService);

    TestObserver<String> test = stringObservable.subscribeOn(scheduler)
                .test();

    test.await()
            .assertResult("wurst");

    assertThat(test.lastThread().getName()).contains("myFancyThread");
}

private String getStuff() {
    return "wurst";
}

关于android - 如何在 RxJava2 (Android) 中创建一个没有输入值但会生成一个字符串的流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43251062/

相关文章:

java - toBlocking() 中的错误处理

java - Eclipse 不允许创建 AVD

android - 在真实设备上振动多次以在android中通知(接近警报)

java - Realm android, RealmTransformer 好像没有应用

java - 如何处理由 Observable 发出的项目并访问另一个 Observable 的值?

android - 测试 RxJava 无限间隔

javascript - RxJS forkjoin 未运行

spring-boot - IntegrationTest : RedisCommandExecutionException: ERR no such key 中抛出的异常

android - 如何使用垫子?

java - 响应式(Reactive) Spring Webflux REST Controller 内部重定向