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開源組件運(yùn)用(compile ’com.jakewharton.rxbinding:rxbinding:1.0.0‘ 不支持rxjava2)
//debounce(1000,TimeUnit.MILLISECONDS)防止按鈕重復(fù)點(diǎn)擊,有bug,點(diǎn)擊按鈕的時候要過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”,“你的美貌不如你的熱鬧”);
//改進(jìn)
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是過濾操作符,就是在設(shè)定的間隔時間內(nèi)對結(jié)果進(jìn)行過濾,這個過程中只會取最后的結(jié)果給訂閱者,忽略中間結(jié)果
//上面的點(diǎn)擊按鈕過了1000ms才響應(yīng),就是取1000ms內(nèi)的最終結(jié)果,肯定得等到1000ms過了才能知道最后的結(jié)果
//debounce運(yùn)用:優(yōu)化APP搜索功能
edit = (EditText)findViewById(R.id.edit);
RxTextView.textChanges(edit).debounce(400,TimeUnit.MILLISECONDS) //只取400ms時間段內(nèi)最后的輸入結(jié)果作為查詢條件
.subscribeOn(AndroidSchedulers.mainThread())//監(jiān)聽EditText需要在主線程中
.filter(new Predicate(){ //只有輸入不為空才進(jìn)行后面的操作
@Override
public boolean test(@NonNull CharSequence charSequence) throws Exception {
//如果你想輸入一個字符就執(zhí)行一次的話可以把這個跟debounce(400,TimeUnit.MILLISECONDS)順序?qū)Q
//不然的話這個就是400ms執(zhí)行一次
return charSequence.toString().trim().length()》0;
}
})
.switchMap(new Function》》() {//用switchMap替換flatMap是為了解決發(fā)送了兩個請求,但是第一個請求的結(jié)果后返回來,導(dǎo)致界面顯示的結(jié)果不正確的問題
//switchMap處理如下:當(dāng)有兩次請求發(fā)出的時候,switchMap只會發(fā)射第二次請求的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操作符,防抖,防止按鈕重復(fù)點(diǎn)擊或點(diǎn)擊過快
//RxBinding2開源組件運(yùn)用(compile ’com.jakewharton.rxbinding2:rxbinding:2.0.0‘ 支持rxjava2)
//防止按鈕點(diǎn)擊過快(取1000ms內(nèi)的第一次點(diǎn)擊響應(yīng))
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”);
}
});
評論
查看更多