RxJava2二刷

3G基础知识

5人已加入

描述

  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”);

  }

  });

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分