配置:
retrofit 到 rxjava 转化库
compile 'io.reactivex:rxandroid:1.9.0'
compile 'io.reactivex:rxjava:1.9.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0'
Retrofit 配置:
Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).client(client) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build();
案例1: 与Retrofit 配合使用
//接口:
@FormUrlEncoded @POST("userv2/login") Observable<Base<User>> login(@Field("mobile") String mobile,@Field("password") String password,@Field("deviceType") String deviceType);
使用:
RestClient.getApiService().login(phone, encryptPassword,"0").subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<Base<User>>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Base<User> userBase) { } });
案例2: 搜索框搜索相关列表,自动延迟400ms,
//搜索并回显
mSearchResultsSubject = PublishSubject.create(); mTextWatchSubscription = mSearchResultsSubject .debounce(400, TimeUnit.MILLISECONDS) .observeOn(Schedulers.io()) .map(new Func1<String, List<String>>() { @Override public List<String> call(String s) { return mRestClient.searchForCity(s); } }) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<List<String>>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(List<String> cities) { handleSearchResults(cities); } });
// 文本框自动输入 mSearchInput.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { mSearchResultsSubject.onNext(s.toString()); } @Override public void afterTextChanged(Editable s) { } });
案例3:发送验证码后,倒计时功能
final long count = TOTAL_TIME / 1000; Observable.interval(0, 1, TimeUnit.SECONDS)//设置0延迟,每隔一秒发送一条数据 .take((int) (count + 1)) //设置总共发送的次数 .map(new Func1<Long, Long>() { //将数值倒置 @Override public Long call(Long aLong) { return count - aLong; // } }) .subscribeOn(Schedulers.computation()) // doOnSubscribe 执行线程由下游逻辑最近的 subscribeOn() 控制,下游没有 subscribeOn() 则跟Subscriber 在同一线程执行 //执行计时任务前先将 button 设置为不可点击 .doOnSubscribe(new Action0() { @Override public void call() { mStart.setEnabled(false);//在发送数据的时候设置为不能点击 mStart.setBackgroundColor(Color.GRAY);//背景色设为灰色 } }) .observeOn(AndroidSchedulers.mainThread())//操作UI主要在UI线程 .subscribe(new Subscriber<Long>() { @Override public void onCompleted() { mTvValue.setText(getResources().getString(R.string.done)); mStart.setEnabled(true); mStart.setBackgroundColor(Color.parseColor("#f97e7e")); } @Override public void onError(Throwable e) { e.printStackTrace(); } @Override public void onNext(Long aLong) { //接收到一条就是会操作一次UI String value = String.valueOf(aLong); mTvValue.setText(value); } });