据我所知,RxJava2 values.take(1)创建了另一个Observable,它只包含原始Observable中的一个元素.哪个不能抛出异常,因为它被take(1)第二次发生的效果过滤掉了.
如下面的代码片段所示
Observable<Integer> values = Observable.create(o -> {
o.onNext(1);
o.onError(new Exception("Oops"));
});
values.take(1)
.subscribe(
System.out::println,
e -> System.out.println("Error: " + e.getMessage()),
() -> System.out.println("Completed")
);
Run Code Online (Sandbox Code Playgroud)
1
Completed
io.reactivex.exceptions.UndeliverableException: java.lang.Exception: Oops
at io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:366)
at io.reactivex.internal.operators.observable.ObservableCreate$CreateEmitter.onError(ObservableCreate.java:83)
at ch02.lambda$main$0(ch02.java:28)
at io.reactivex.internal.operators.observable.ObservableCreate.subscribeActual(ObservableCreate.java:40)
at io.reactivex.Observable.subscribe(Observable.java:10841)
at io.reactivex.internal.operators.observable.ObservableTake.subscribeActual(ObservableTake.java:30)
at io.reactivex.Observable.subscribe(Observable.java:10841)
at io.reactivex.Observable.subscribe(Observable.java:10827)
at io.reactivex.Observable.subscribe(Observable.java:10787)
at ch02.main(ch02.java:32)
Caused by: java.lang.Exception: Oops
... 8 more
Exception in thread "main" io.reactivex.exceptions.UndeliverableException: java.lang.Exception: Oops
at io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:366)
at io.reactivex.internal.operators.observable.ObservableCreate$CreateEmitter.onError(ObservableCreate.java:83)
at ch02.lambda$main$0(ch02.java:28)
at …Run Code Online (Sandbox Code Playgroud) 我只是在学习Rx-java和Rxandroid2,我只是混淆了SubscribeOn和ObserveOn之间的主要区别.
升级Android Studio 3.0 Beta 1后出现以下错误.当我降级时,错误消失了.
Studio Build:Android Studio 3.0 Beta 1 Gradle插件版本:'com.android.tools.build:grad:3.0.0-beta1'Gradle版本:.0.0-beta1 Java版本:8 OS:MacOSX
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/devtools/build/android/desugar/runtime/ThrowableExtension;
at io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:364)
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:113)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6121)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
Caused by: java.lang.ClassNotFoundException:
Didn't find class "com.google.devtools.build.android.desugar.runtime.ThrowableExtension" on path: DexPathList[[zip file "/data/app/sark.savvy.Debug-1/base.apk",
zip file "/data/app/sark.savvy.Debug-1/split_lib_dependencies_apk.apk", zip file "/data/app/sark.savvy.Debug-1/split_lib_slice_0_apk.apk",
zip file "/data/app/sark.savvy.Debug-1/split_lib_slice_1_apk.apk", zip file "/data/app/sark.savvy.Debug-1/split_lib_slice_2_apk.apk",
zip file "/data/app/sark.savvy.Debug-1/split_lib_slice_3_apk.apk", zip file "/data/app/sark.savvy.Debug-1/split_lib_slice_4_apk.apk",
zip file "/data/app/sark.savvy.Debug-1/split_lib_slice_5_apk.apk", zip file "/data/app/sark.savvy.Debug-1/split_lib_slice_6_apk.apk",
zip file "/data/app/sark.savvy.Debug-1/split_lib_slice_7_apk.apk", zip file "/data/app/sark.savvy.Debug-1/split_lib_slice_8_apk.apk", …Run Code Online (Sandbox Code Playgroud) 如果一个observable完成了,我是否还必须取消订阅/处置(在RxJava2中)observable以删除Observer(防止内存泄漏),或者一旦发生onComplete或onError事件发生,这是由RxJava内部处理的吗?
对其他类型的像什么Single,Completable,Flowable等.
我的问题可以是如何使用RxJava 2的CompositeDisposable的副本?但要求澄清一个疑问.根据接受的答案
// Using clear will clear all, but can accept new disposable
disposables.clear();
// Using dispose will clear all and set isDisposed = true, so it will not accept any new disposable
disposables.dispose();
Run Code Online (Sandbox Code Playgroud)
在我的例子中,我使用片段作为我的视图(在MVP中查看图层),在某些情况下,我将活动片段添加到backstack,实际上不会杀死Fragment但只会查看其视图.这意味着只onDestroyView调用而不是调用onDestroy.后来我可以回到后台堆叠的同一个片段,所以只有它的视图才被重新创建.我有一个CompositeDisposable作为我的成员BaseFragment持有订阅.
我的问题是,我应该叫clear上CompositeDisposable每个时间onDestroyView?一旦视图恢复,它可以再次获取订阅吗?并调用dispose的onDestroy时候片段本身被破坏没有必要采取一次性用品了,所以呢?
如果错了,处理的正确方法是什么.当clear和dispose具有被称为?
我有Observable流,我想将它转换为Completable,我怎么能这样做?
我打开示例代码BasicRxJavaSample(来自这篇文章Room + RxJava)主要的是:
@Rule
public InstantTaskExecutorRule instantTaskExecutorRule =
new InstantTaskExecutorRule();
Run Code Online (Sandbox Code Playgroud)
并且BasicRxJavaSample都可以.但我不能在我的测试中应用这个.这是正在发生的事情:
无法解析符号InstantTaskExecutorRule
手动导入不起作用:
但应该如此
我的app build.gradle(完全gradle在这里):
// tests
testImplementation 'junit:junit:4.12'
androidTestCompile "com.android.support:support-annotations:$supportVersion"
testImplementation "android.arch.core:core-testing:$archVersion"
// Test helpers for Room
testImplementation "android.arch.persistence.room:testing:1.0.0"
// https://github.com/mockito/mockito
testImplementation 'org.mockito:mockito-core:2.13.0'
androidTestImplementation 'org.mockito:mockito-android:2.13.0'
// AndroidJUnitRunner and JUnit Rules
androidTestImplementation 'com.android.support.test:rules:1.0.1'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
// https://developer.android.com/topic/libraries/testing-support-library/packages.html
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
androidTestCompile 'com.android.support.test.espresso:espresso-idling-resource:3.0.1'
Run Code Online (Sandbox Code Playgroud) 我正在使用 RxJava3 和改造,但我无法获得 RxJava3 的 rxjava3 改造适配器。
我在我的项目中使用RxJava2,Kotlin-1.1和RxBindings.
我有一个简单的登录界面,默认情况下禁用"登录"按钮,我想只在用户名和密码的edittext字段不为空时启用该按钮.
LoginActivity.java
Observable<Boolean> isFormEnabled =
Observable.combineLatest(mUserNameObservable, mPasswordObservable,
(userName, password) -> userName.length() > 0 && password.length() > 0)
.distinctUntilChanged();
Run Code Online (Sandbox Code Playgroud)
我无法将上述代码从Java翻译成Kotlin:
LoginActivity.kt
class LoginActivity : AppCompatActivity() {
val disposable = CompositeDisposable()
private var userNameObservable: Observable<CharSequence>? = null
private var passwordObservable: Observable<CharSequence>? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
initialize()
}
fun initialize() {
userNameObservable = RxTextView.textChanges(username).skip(1)
.debounce(500, TimeUnit.MILLISECONDS)
passwordObservable = RxTextView.textChanges(password).skip(1)
.debounce(500, TimeUnit.MILLISECONDS)
}
private fun setSignInButtonEnableListener() {
val isSignInEnabled: Observable<Boolean> = Observable.combineLatest(userNameObservable,
passwordObservable,
{ u: CharSequence, p: CharSequence …Run Code Online (Sandbox Code Playgroud) 我想Observable使用RxJava 2 创建一个来自视图的单击侦听器.我从最简单的实现开始(我不在这里使用lambdas来向您展示此方法中的不同类型):
Observable<View> viewObservable = Observable.create(new ObservableOnSubscribe<View>() {
@Override
public void subscribe(@NonNull ObservableEmitter<View> e) throws Exception {
mNewWordView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View value) {
if (!e.isDisposed()) {
e.onNext(value);
}
}
});
}
});
Run Code Online (Sandbox Code Playgroud)
然后我想到了onClickListener如果不需要进一步设置为null 的方法.我发现有两种类似(对我来说)名称的方法:
e.setCancellable(Cancellable c); 和
e.setDisposable(Disposable d);
它们之间有什么区别,我应该使用哪种?
rx-java2 ×10
android ×7
java ×5
rx-java ×4
observable ×2
junit4 ×1
kotlin ×1
retrofit ×1
rx-android ×1
rx-binding ×1
take ×1
unit-testing ×1