android-基础07-RxJava-使用场景

学习笔记,自用,整理中

摘要:

重要是Rxjava思路:

响应式开发,一种管理思想,起点分发事件,一条线往下走,中间可以加多个节点处理,下一节点的输入是上一节点的输出,终点消费事件。

起点(分发事件:点击登录)--->登录api-->请求服务器--->获取响应码-->终点(更新ui成功,消费事件)。

术语:

Schedulers.io,如果是cpu大量计算则用scheduler.compxxx

RXbinding防抖功能

flatmap:解决嵌套,

doNext解决多api调用

用例1:

flatmap的使用 rxbingd的使用

public interface WangAndroidApi {

// 总数据

    @GET("project/tree/json")

ObservablegetProject();  // 异步线程 耗时操作

    // ITem数据

    @GET("project/list/{pageIndex}/json")// ?cid=294

    ObservablegetProjectItem(@Path("pageIndex")int pageIndex, @Query("cid")int cid);  // 异步线程 耗时操作

}

-----------------------------------------------------------------------------------------------------------------------------------------------------------

public class HttpUtil {

private static final StringTAG ="HttpUtils";

    /**

    * 默认 test-a环境

    */

    public static StringBASE_URL ="https://www.wanandroid.com/";

    public static void setBaseUrl(String baseUrl) {

BASE_URL = baseUrl;

    }

/**

    * 根据各种配置创建出Retrofit

    * @return 返回创建好的Retrofit

*/

    public static RetrofitgetOnlineCookieRetrofit() {

// OKHttp客户端

        OkHttpClient.Builder httpBuilder =new OkHttpClient.Builder();

        // 各种参数配置

        OkHttpClient okHttpClient = httpBuilder

.addNetworkInterceptor(new StethoInterceptor())

.readTimeout(10000, TimeUnit.SECONDS)

.connectTimeout(10000, TimeUnit.SECONDS)

.writeTimeout(10000, TimeUnit.SECONDS)

.build();

        return new Retrofit.Builder().baseUrl(BASE_URL)

// TODO 请求用OKhttp

                .client(okHttpClient)

// TODO 响应RxJava

                // 添加一个json解析的工具

                .addConverterFactory(GsonConverterFactory.create(new Gson()))

// 添加rxjava处理工具

                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())

.build();

    }

}

----------------------------------------------------------------------------------------------------------------------------------
/**

* TODO 功能防抖 + 网络嵌套 (解决嵌套的问题) flatMap

*/

@SuppressLint("CheckResult")

private void antiShakeActonUpdate() {

// 注意:项目分类查询的id,通过此id再去查询(项目列表数据)

    // 对那个控件防抖动?

    Button bt_anti_shake = findViewById(R.id.bt_anti_shake);

    RxView.clicks(bt_anti_shake)

.throttleFirst(2000, TimeUnit.MILLISECONDS)// 2秒钟之内 响应你一次

            // 我只给下面 切换 异步

            .observeOn(Schedulers.io())

.flatMap(new Function>() {

@Override

public ObservableSourceapply(Object o)throws Exception {

return api.getProject(); // 主数据

                }

})

.flatMap(new Function>() {

@Override

public ObservableSourceapply(ProjectBean projectBean)throws Exception {

return Observable.fromIterable(projectBean.getData()); // 我自己搞一个发射器 发多次10

                }

})

.flatMap(new Function>() {

@Override

public ObservableSourceapply(ProjectBean.DataBean dataBean)throws Exception {

return api.getProjectItem(1, dataBean.getId());

                }

})

.observeOn(AndroidSchedulers.mainThread())// 给下面切换 主线程

            .subscribe(new Consumer() {

@Override

public void accept(ProjectItem projectItem)throws Exception {

// 如果我要更新UI  会报错2  不会报错1

                    Log.d(TAG, "accept: " + projectItem);

                }

});

}


用例2

doNext的使用

/**

* TODO ================= 下面是一行代码完成整个需求

*/

private ProgressDialogprogressDialog;

Disposabledisposable;

public void request2(View view) {

/**

    * 一行代码 实现需求

    * 需求:

    *  还有弹出加载

    *  * 1.请求服务器注册操作

    *  * 2.注册完成之后,更新注册UI

    *  * 3.马上去登录服务器操作

    *  * 4.登录完成之后,更新登录的UI

*/

    MyRetrofit.createRetrofit().create(IReqeustNetwor.class)

.registerAction(new RegisterRequest())// todo 1.请求服务器注册操作// todo 2

            .subscribeOn(Schedulers.io())// 给上面 异步

            .observeOn(AndroidSchedulers.mainThread())// 给下面分配主线程

            .doOnNext(new Consumer() {// todo 3

                @Override

public void accept(RegisterResponse registerResponse)throws Exception {

// todo 2.注册完成之后,更新注册UI

                }

})

// todo 3.马上去登录服务器操作

            .observeOn(Schedulers.io())// 给下面分配了异步线程

            .flatMap(new Function>() {// todo 4

                @Override

public ObservableSourceapply(RegisterResponse registerResponse)throws Exception {

Observable loginResponseObservable = MyRetrofit.createRetrofit().create(IReqeustNetwor.class)

.loginAction(new LoginReqeust());

                    return loginResponseObservable;

                }

})

.observeOn(AndroidSchedulers.mainThread())// 给下面 执行主线程

            .subscribe(new Observer() {

// 一定是主线程,为什么,因为 subscribe 马上调用onSubscribe

                @Override

public void onSubscribe(Disposable d) {

// TODO 1

                    progressDialog =new ProgressDialog(RequestActivity.this);

                    progressDialog.show();

                    // UI 操作

                    disposable = d;

                }

@Override

public void onNext(LoginResponse loginResponse) {// todo 5

                    // TODO 4.登录完成之后,更新登录的UI

                }

@Override

public void onError(Throwable e) {

}

// todo 6

                @Override

public void onComplete() {

// 杀青了

                    if (progressDialog !=null) {

progressDialog.dismiss();

                    }

}

});

}

@Override

protected void onDestroy() {

super.onDestroy();

    // 必须这样写,最起码的标准

    if (disposable !=null)

if (!disposable.isDisposed())

disposable.dispose();

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容