RxJava配合Retrofit,RxJava之防抖与网络嵌套

7 篇文章 0 订阅

RxJava配合Retrofit:

Retrofit请求服务器(通过okhttp)拿到响应码给RxJava,RxJava处理回来的数据,Retrofit是典型的封装框架
Retrofit是一个封装框架,Retrofit不是网络请求框架

public class HttpUtil {

    private static final String TAG = "HttpUtils";


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

    public static void setBaseUrl(String baseUrl) {
        BASE_URL = baseUrl;
    }

    /**
     * 根据各种配置创建出Retrofit
     *
     * @return 返回创建好的Retrofit
     */
    public static Retrofit getOnlineCookieRetrofit() {
        // 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();


        //完全等价图中的 Retrofit(封装框架)
        return new Retrofit.Builder().baseUrl(BASE_URL)
                // TODO 请求用 OKhttp
                .client(okHttpClient)

                // TODO 响应RxJava
                // 添加一个json解析的工具
                .addConverterFactory(GsonConverterFactory.create(new Gson()))
                // 添加rxjava处理工具
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())

                .build();
    }

}
public class UseActivity extends AppCompatActivity {

    private final static String TAG = UseActivity.class.getSimpleName();

    private WanAndroidApi api;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_use);

        api = HttpUtil.getOnlineCookieRetrofit().create(WanAndroidApi.class);

    }


    /**
     * TODO Retrofit+RxJava 查询 项目分类  (总数据查询)
     *
     * @param view
     */
    public void getProjectAction(View view) {
        // 获取网络API
        api.getProject()//起点  返回的Observable
                .subscribeOn(Schedulers.io()) // 上面 异步线程
                .observeOn(AndroidSchedulers.mainThread()) // 下面 主线程
                .subscribe(new Consumer<ProjectBean>() {   //new Observable 的简略写法
                    @Override
                    public void accept(ProjectBean projectBean) throws Exception {
                        Log.d(TAG, "accept: " + projectBean); // UI 可以做事情
                    }
                });
    }


    /**
     * TODO Retrofit+RxJava 查询 获取项目列表数据  (Item)
     *
     * @param view
     */
    public void getProjectListAction(View view) {

        // id 写死的
        api.getProjectItem(1, 294) //起点  返回的Observable
                // .....
                .subscribeOn(Schedulers.io()) // 上面 异步
                .observeOn(AndroidSchedulers.mainThread()) // 下面 主线程
                .subscribe(data->{
                    Log.d(TAG, "getProjectListAction: " + data);
                });

    }
    
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".retrofit.UseActivity"
    android:orientation="vertical">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="项目分类"
        android:onClick="getProjectAction"
        />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="项目列表数据"
        android:onClick="getProjectListAction"
        />

</LinearLayout>

逻辑图:

在这里插入图片描述

防抖

自动化脚本一秒点button百次只响应一次(不抖动)
RxBinding 防抖

public class UseActivity extends AppCompatActivity {
    
    private final static String TAG = UseActivity.class.getSimpleName();

    private WanAndroidApi api;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_use);

        api = HttpUtil.getOnlineCookieRetrofit().create(WanAndroidApi.class);

        // 功能防抖 + 网络嵌套
        antiShakeActonUpdate();
    }


    /**
     * TODO Retrofit+RxJava 查询 项目分类  (总数据查询)
     *
     * @param view
     */
    public void getProjectAction(View view) {
        // 获取网络API
        api.getProject()//起点  返回的Observable
                .subscribeOn(Schedulers.io()) // 上面 异步线程
                .observeOn(AndroidSchedulers.mainThread()) // 下面 主线程
                .subscribe(new Consumer<ProjectBean>() {   //new Observable 的简略写法
                    @Override
                    public void accept(ProjectBean projectBean) throws Exception {
                        Log.d(TAG, "accept: " + projectBean); // UI 可以做事情
                    }
                });
    }


    /**
     * TODO Retrofit+RxJava 查询 获取项目列表数据  (Item)
     *
     * @param view
     */
    public void getProjectListAction(View view) {

        // id 写死的
        api.getProjectItem(1, 294) //起点  返回的Observable
                // .....
                .subscribeOn(Schedulers.io()) // 上面 异步
                .observeOn(AndroidSchedulers.mainThread()) // 下面 主线程
                .subscribe(data->{
                    Log.d(TAG, "getProjectListAction: " + data);
                });

    }


    /**
     * RxBinding  防抖
     * TODO 功能防抖 + 网络嵌套(负面教程)
     */
    @SuppressLint("CheckResult")
    private void antiShakeActon() {
        // 注意:(项目分类)查询的id,通过此id再去查询(项目列表数据)

        // 对那个控件防抖动?
        Button bt_anti_shake = findViewById(R.id.bt_anti_shake);

        RxView.clicks(bt_anti_shake)
                .throttleFirst(2000, TimeUnit.MILLISECONDS) // 2秒钟之内 响应你一次
                .subscribe(new Consumer<Object>() {
                    @Override
                    public void accept(Object o) throws Exception {
                        api.getProject() // 查询主数据
                                .compose(DownloadActivity.rxud())
                                .subscribe(new Consumer<ProjectBean>() {
                                    @Override
                                    public void accept(ProjectBean projectBean) throws Exception {
                                        for (ProjectBean.Data dataBean : projectBean.getData()) { // 10
                                            // 查询item数据
                                            api.getProjectItem(1, dataBean.getId())
                                                    .compose(DownloadActivity.rxud())
                                                    .subscribe(new Consumer<ProjectItem>() {
                                                        @Override
                                                        public void accept(ProjectItem projectItem) throws Exception {
                                                            Log.d(TAG, "accept: " + projectItem); // 可以UI操作
                                                        }
                                                    });
                                        }
                                    }
                                });
                    }
                });
    }


    /**
     * 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<Object, ObservableSource<ProjectBean>>() {
                    @Override
                    public ObservableSource<ProjectBean> apply(Object o) throws Exception {
                        return api.getProject(); // 主数据
                    }
                })

                //发射多次
                .flatMap(new Function<ProjectBean, ObservableSource<ProjectBean.Data>>() {
                    @Override
                    public ObservableSource<ProjectBean.Data> apply(ProjectBean projectBean) throws Exception {
                        return Observable.fromIterable(projectBean.getData()); // 我自己搞一个发射器 发多次
                    }
                })
                .flatMap(new Function<ProjectBean.Data, ObservableSource<ProjectItem>>() {
                    @Override
                    public ObservableSource<ProjectItem> apply(ProjectBean.Data dataBean) throws Exception {
                        return api.getProjectItem(1, dataBean.getId());
                    }
                })

                .observeOn(AndroidSchedulers.mainThread()) // 给下面切换 主线程
                .subscribe(new Consumer<ProjectItem>() {
                    @Override
                    public void accept(ProjectItem projectItem) throws Exception {
                        // 如果我要更新UI
                        Log.d(TAG, "accept: " + projectItem);
                    }
                });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
    
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".retrofit.UseActivity"
    android:orientation="vertical">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="项目分类"
        android:onClick="getProjectAction"
        />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="项目列表数据"
        android:onClick="getProjectListAction"
        />

    <Button
        android:id="@+id/bt_anti_shake"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="功能防抖"
        />

</LinearLayout>

flatMap逻辑图:

在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值