RxJava2二刷:
1、java.lang.IllegalStateException: Exception thrown on Scheduler.Worker thread. Add `onError` handling.
Caused by: rx.exceptions.OnErrorNotImplementedException: Can‘t create handler inside thread that has not called Looper.prepare()
错误代码:
//RxBinding开源组件运用(compile ’com.jakewharton.rxbinding:rxbinding:1.0.0‘ 不支持rxjava2)
//debounce(1000,TimeUnit.MILLISECONDS)防止按钮重复点击,有bug,点击按钮的时候要过1000毫秒后才能弹出toast,体验并不好
Button btn = (Button)findViewById(R.id.btn);
RxView.clicks(btn).debounce(1000,TimeUnit.MILLISECONDS).subscribe(new Action1){
@Override
public void call(Void aVoid) {
//非主线程不能更新UI及弹toast,可以打印日志
Toast.makeText(WebActivity.this,“你的美貌不如你的热闹”,Toast.LENGTH_SHORT).show();
Log.i(“wanlijun”,“你的美貌不如你的热闹”);
//改进
mHandler.sendEmptyMessage(1);
}
}
private Handler mHandler = new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
Toast.makeText(WebActivity.this,“你的美貌不如你的热闹”,Toast.LENGTH_SHORT).show();
break;
}
}
};
备注:上面是我没有深入了解debounce和throttleFirst,狭隘了
//debounce是过滤操作符,就是在设定的间隔时间内对结果进行过滤,这个过程中只会取最后的结果给订阅者,忽略中间结果
//上面的点击按钮过了1000ms才响应,就是取1000ms内的最终结果,肯定得等到1000ms过了才能知道最后的结果
//debounce运用:优化APP搜索功能
edit = (EditText)findViewById(R.id.edit);
RxTextView.textChanges(edit).debounce(400,TimeUnit.MILLISECONDS) //只取400ms时间段内最后的输入结果作为查询条件
.subscribeOn(AndroidSchedulers.mainThread())//监听EditText需要在主线程中
.filter(new Predicate(){ //只有输入不为空才进行后面的操作
@Override
public boolean test(@NonNull CharSequence charSequence) throws Exception {
//如果你想输入一个字符就执行一次的话可以把这个跟debounce(400,TimeUnit.MILLISECONDS)顺序对换
//不然的话这个就是400ms执行一次
return charSequence.toString().trim().length()》0;
}
})
.switchMap(new Function》》() {//用switchMap替换flatMap是为了解决发送了两个请求,但是第一个请求的结果后返回来,导致界面显示的结果不正确的问题
//switchMap处理如下:当有两次请求发出的时候,switchMap只会发射第二次请求的Observable
@Override
public ObservableSource》 apply(@NonNull CharSequence charSequence) throws Exception {
Log.i(“wanlijun”,“world wide web 我的世界”);
return Observable.just(Arrays.asList(“Java”, “C#”, “Clojure”));
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer》() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull List strings) {
Log.i(“wanlijun”,“onNext”);
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
//throttlrFirst操作符,防抖,防止按钮重复点击或点击过快
//RxBinding2开源组件运用(compile ’com.jakewharton.rxbinding2:rxbinding:2.0.0‘ 支持rxjava2)
//防止按钮点击过快(取1000ms内的第一次点击响应)
RxView.clicks(hahaBtn).throttleFirst(1000,TimeUnit.MILLISECONDS).subscribe(new Observer() {
@Override
public void onNext(@NonNull Object o) {
//惊不惊喜,意不意外,不用加subscribeOn(AndroidSchedulers.mainThread()),也没有用Handler,可以直接弹toast哦!
Toast.makeText(WebActivity.this,“你的美貌不如你的热闹”,Toast.LENGTH_SHORT).show();
Log.i(“wanlijun”,“你的美貌不如你的热闹”);
}
@Override
public void onComplete() {
Log.i(“wanlijun”,“onComplete”);
}
@Override
public void onError(@NonNull Throwable e) {
Log.i(“wanlijun”,“onError”);
}
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.i(“wanlijun”,“onSubscribe”);
}
});
评论
查看更多