zoukankan      html  css  js  c++  java
  • Retrofit + rxjava 使用案例

    配置:

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

      



  • 相关阅读:
    快速排序
    C# String.Format
    理解C++ static
    程序地址空间
    map的实现
    【S4】使用empty()而不是判断size()是否为0
    RHEL6.4 NFS文件共享服务器搭建
    使用UDEV绑定ASM多路径磁盘
    MySQL的启动程序
    [ERROR] Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root!
  • 原文地址:https://www.cnblogs.com/songsh/p/6573481.html
Copyright © 2011-2022 走看看