Android MVP+RxJava+Retrofit (3) MVP+RxJava+Retrofit

Android MVP+RxJava+Retrofit (3) MVP+RxJava+Retrofit

前面说了RxJavaRetrofit的基本用法,但是没用做优化的处理.本篇先做一个优化处理,然后再结合前面的MVP 设计模式,把这些知识贯穿到一个Demo 之中,方便大家理解.

BaseResponse与BaseObserver的封装

BaseResponse是个人自定义命名的一个类,主要用来对返回数据进行抽象。
BaseObserver是对返回数据的基础数据部分进行统一处理。
在这里插入图片描述
BaseResponse就是对基础数据进行封装处理。

修改API接口返回数据类型,对基础数据进行封装处理
我的数据类型是返回的是数组,那么我们定义的则是

public class BaseListResponse<T> implements Serializable {
   
    private String msg;
    private int status;
    private List<T> result;

    public List<T> getResult() {
   
        return result;
    }

    public void setResult(List<T> result) {
   
        this.result = result;
    }


    public String getMsg() {
   
        return msg;
    }

    public void setMsg(String msg) {
   
        this.msg = msg;
    }

    public int getStatus() {
   
        return status;
    }

    public void setStatus(int status) {
   
        this.status = status;
    }

}

有人问了 如果返回的是对象 那你怎么办?? 不要担心 马上定义

public class BaseResponse<T> implements Serializable {
   
    private String msg;
    private int status;

    public T getResult() {
   
        return result;
    }

    public void setResult(T result) {
   
        this.result = result;
    }

    private T result;

    public String getMsg() {
   
        return msg;
    }

    public void setMsg(String msg) {
   
        this.msg = msg;
    }

    public int getStatus() {
   
        return status;
    }

    public void setStatus(int status) {
   
        this.status = status;
    }

}

对返回数据的处理

  .subscribe(new Observer<BaseListResponse<GoodsBean>>() {
   
                    @Override
                    public void onSubscribe(Disposable d) {
   

                    }
                    @Override
                    public void onNext(BaseListResponse<GoodsBean> goodsList) {
   
                        etUserName.setText(goodsList.getResult().get(1).getP_name());
                    }

                    @Override
                    public void onError(Throwable e) {
   

                    }

                    @Override
                    public void onComplete() {
   

                    }
                });

对基础数据统一封装处理 这里以返回的类型是数组为例

public abstract class BaseObserverList<T> implements Observer<BaseListResponse<T>> {
   
    private static final String TAG = "BaseObserverList";

    @Override
    public void onSubscribe(Disposable d) {
   
        Log.e(TAG, "onSubscribe: ");
    }

    @Override
    public void onNext(BaseListResponse<T> response) {
   
        //在这边对 基础数据 进行统一处理 举个例子:
        if (response.getStatus() == 0) {
   
            onSuccess(response.getResult());
        } else {
   
            onFailure(null, response.getMsg());
        }
    }

    @Override
    public void onError(Throwable e) {
   
        Log.e(TAG, "Throwable: " + e.getMessage());
    }

    @Override
    public void onComplete() {
   
        Log.e(TAG, "onComplete: ");
    }
    public abstract void onSuccess(List<T> demo);

    public abstract void onFailure(Throwable e, String errorMsg);
}

请求网络数据

    Api api = retrofit.create(Api.class);
        api.getCall("0", "1")
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new BaseObserverList<GoodsBean>() {
   
                    @Override
                    public void onSuccess(List<GoodsBean> list) {
   
                    //请求成功
                     etUserName.setText(list.get(0).getP_name());
                    }

                    @Override
                    public void onFailure(Throwable e, String errorMsg) {
   

                    }
                });

接下来我要说的 就是MVP 设计模式 下 请求网络获取商品列表并展示的过程了
这个是效果图 就是请求网络并获取商品列表的功能
在这里插入图片描述
根据之前 MVP 设计模式,外加RxJava+Retrofit 网络请求 整合在一起

mvp 接口管理类

public interface HomeGoodsContract {
   

    interface Model {
   

        void GoodsList(String cid, String page, OnGoodsListener goodsListener);
    }

    interface View {
   

        void showFail();

        void showLoading();

        void hideLoading();

        //展示商品列表
        void showGoodsList(List<GoodsBean> result);
    }

    interface Presenter {
   

        void getGoodsList();
    }
}

Model层

public class HomeGoodsModel implements HomeGoodsContract.Model {
   

    private HomeGoodsActivity context;
    public HomeGoodsModel(HomeGoodsActivity context) {
   
       this.context = context;
    }

    @Override
    public void GoodsList(String cid, String page,final OnGoodsListener goodsListener) {
   
        RequestUtils.PutCall(context, cid, page, new BaseObserverList<GoodsBean>() {
   
            @Override
            public void onSuccess(List<GoodsBean> demo) {
   

                goodsListener.getGoodsSuccess(demo);
            }

            @Override
            public void onFailure(Throwable e, String errorMsg) {
   
                goodsListener.getGoodsFailed();
            }
        });

    }
}

这里面有两个类 OnGoodsListener 接口类 RequestUtils 提交参数的管理类

RequestUtils 提交参数的管理类

//提交参数的管理类
public class RequestUtils {
   

    public static void PutCall(HomeGoodsActivity context, String cid, String page, BaseObserverList<GoodsBean> consumer){
   
        RetrofitUtils.getApiUrl()
                .getCall(cid,page).compose(RxHelper.observableIO2Main(context))
                .subscribe(consumer);
    }
}

OnGoodsListener 接口回调

//接口回调类
public interface OnGoodsListener {
   

    //获取商品列表成功的回调
    void getGoodsSuccess(List<GoodsBean> result);

    //获取失败的回调
    void getGoodsFailed();
}

之后的一些工具类我放在本文的最后 并附加源码

Presenter层中的操作

public class HomeGoodsPresenter implements HomeGoodsContract.Presenter {
   

    private HomeGoodsContract.View homeGoodsView;

    private HomeGoodsModel homeGoodModel;

    //Presenter必须要能拿到View和Model的实现类
    public HomeGoodsPresenter(HomeGoodsActivity context, HomeGoodsContract.View view) {
   
        this.homeGoodsView = view;
        this.homeGoodModel = new HomeGoodsModel(context);
    }



    @Override
    public void getGoodsList() {
   
        homeGoodsView.showLoading();
        //填写请求参数
        homeGoodModel.GoodsList("0", "1", new OnGoodsListener() {
   
            @Override
            public void getGoodsSuccess(List<GoodsBean> result) {
   
                homeGoodsView.showGoodsList(result);
                homeGoodsView.hideLoading();
            }

            @Override
            public void getGoodsFailed() {
   
                homeGoodsView.showFail();
                homeGoodsView.hideLoading();
            }
        });
    }
}

最后则是View 的操作了

public class HomeGoodsActivity extends RxActivity implements HomeGoodsContract.View {
   

    private HomeGoodsPresenter presenter;
    private LoadingDialog loadingDialog;
    private RecyclerView rcList;
    private ShopMallGoodsAdapter adapterX;
    private List<GoodsBean> shopGoodsList;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        presenter = new HomeGoodsPresenter(HomeGoodsActivity.this, this);
        initView();
    }

    private void initView() {
   
        loadingDialog = new LoadingDialog(HomeGoodsActivity.this, "加载中...");
        shopGoodsList = new ArrayList<>();
        rcList = findViewById(R.id.rc_list);
        SpaceItemDecoration spaceItemDecoration = new SpaceItemDecoration(AutoSizeUtils.dp2px(this, 1.5f));
        rcList.addItemDecoration(spaceItemDecoration);
        adapterX = new ShopMallGoodsAdapter(R.layout.item_peijian_shop, shopGoodsList);
        View view = LayoutInflater.from(this).inflate(R.layout.list_no_data_new, rcList, false);
        ImageView noGoods = view.findViewById(R.id.no_goods);
        noGoods.setVisibility(View.VISIBLE);
        TextView tv_msg = view.findViewById(R.id.tv_msg);
        tv_msg.setText("没有相关商品");
        adapterX.setEmptyView(view);
        adapterX.isUseEmpty(false);
        rcList.setAdapter(adapterX);
		//获取商品
        presenter.getGoodsList();

    }

    @Override
    public void showFail() {
   
        Toast.makeText(this, "获取商品列表失败", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void showLoading() {
   
        loadingDialog.show();
    }

    @Override
    public void hideLoading() {
   
        loadingDialog.dismiss();
    }

    @Override
    public void showGoodsList(List<GoodsBean> result) {
   

        if (result.isEmpty() || result == null || result.size() == 0) {
   
            adapterX.isUseEmpty(true);
        }
        shopGoodsList.addAll(result);
        adapterX.notifyDataSetChanged();
    }

}

剩下的则是我说的有关一些工具类了

RxHelper 调度类

public class RxHelper {
   

    public static <T> ObservableTransformer<T, T> observableIO2Main(final Context context) {
   
        return new ObservableTransformer<T, T>() {
   
            @Override
            public ObservableSource<T> apply(Observable<T> upstream) {
   
                Observable<T> observable = upstream.subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread());
                return composeContext(context, observable);
            }
        };
    }

    public static <T> ObservableTransformer<T, T> observableIO2Main(final RxFragment fragment) {
   
        return upstream -> upstream.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread()).compose(fragment.<T>bindToLifecycle());
    }

    public static <T> FlowableTransformer<T, T> flowableIO2Main() {
   
        return new FlowableTransformer<T, T>() {
   
            @Override
            public Publisher<T> apply(Flowable<T> upstream) {
   
                return upstream
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread());
            }
        };
    }

    private static <T> ObservableSource<T> composeContext(Context context, Observable<T> observable) {
   
        if(context instanceof RxActivity) {
   
            return observable.compose(((RxActivity) context).bindUntilEvent(ActivityEvent.DESTROY));
        } else if(context instanceof RxFragmentActivity){
   
            return observable.compose(((RxFragmentActivity) context).bindUntilEvent(ActivityEvent.DESTROY));
        }else if(context instanceof RxAppCompatActivity){
   
            return observable.compose(((RxAppCompatActivity) context).bindUntilEvent(ActivityEvent.DESTROY));
        }else {
   
            return observable;
        }
    }
}

异常处理类

public class RxExceptionUtil {
   

    public static String exceptionHandler(Throwable e){
   
        String errorMsg = "未知错误";
        if (e instanceof UnknownHostException) {
   
            errorMsg = "网络不可用";
        } else if (e instanceof SocketTimeoutException) {
   
            errorMsg = "请求网络超时";
        } else if (e instanceof HttpException) {
   
            HttpException httpException = (HttpException) e;
            errorMsg = convertStatusCode(httpException);
        } else if (e instanceof ParseException || e instanceof JSONException
                || e instanceof JSONException) {
   
            errorMsg = "数据解析错误";
        }
        return errorMsg;
    }

    private static String convertStatusCode(HttpException httpException) {
   
        String msg;
        if (httpException.code() >= 500 && httpException.code() < 600) {
   
            msg = "服务器处理请求出错";
        } else if (httpException.code() >= 400 && httpException.code() < 500) {
   
            msg = "服务器无法处理请求";
        } else if (httpException.code() >= 300 && httpException.code() < 400) {
   
            msg = "请求被重定向到其他页面";
        } else {
   
            msg = httpException.message();
        }
        return msg;
    }
}

RetrofitUtils 工具类

public class RetrofitUtils {
   

    private static final String TAG = "RetrofitUtils";
    private static Api mApiUrl;
    /** * 单例模式 */
    public static Api getApiUrl() {
   
        if (mApiUrl == null) {
   
            synchronized (RetrofitUtils.class) {
   
                if (mApiUrl == null) {
   
                    mApiUrl = new RetrofitUtils().getRetrofit();
                }
            }
        }
        return mApiUrl;
    }
    private RetrofitUtils(){
   }

    public Api getRetrofit() {
   
        // 初始化Retrofit
        Api apiUrl = initRetrofit(initOkHttp()) .create(Api.class);
        return apiUrl;
    }

    /** * 初始化Retrofit */
    @NonNull
    private Retrofit initRetrofit(OkHttpClient client) {
   
        return new Retrofit.Builder()
                .client(client)
                .baseUrl(Constant.IP)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }

    /** * 初始化okhttp */
    @NonNull
    private OkHttpClient initOkHttp() {
   
        return new OkHttpClient().newBuilder()
                .readTimeout(Constant.DEFAULT_TIME, TimeUnit.SECONDS)//设置读取超时时间
                .connectTimeout(Constant.DEFAULT_TIME, TimeUnit.SECONDS)//设置请求超时时间
                .writeTimeout(Constant.DEFAULT_TIME,TimeUnit.SECONDS)//设置写入超时时间
                .addInterceptor(new LogInterceptor())//添加打印拦截器
                .retryOnConnectionFailure(true)//设置出现错误进行重新连接。
                .build();
    }
}

关于源码 大家只需要看Goods类中的就可以了
源码下载地址:
https://download.csdn.net/download/MacaoPark/12598137

希望可以帮到你

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2820.html原文链接:https://javaforall.net

(1)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 软件缺陷报告[通俗易懂]

    软件缺陷报告[通俗易懂]1、定义概述:标识并描述发现的缺陷,具有清晰、完整和可重视问题所需的信息的文档理解:测试人员发现缺陷,记录,通过缺陷报告将缺陷报告给开发人员,并对缺陷进行跟踪管理。缺陷报告是测试人员与开发人员之间重要的沟通方式2、什么是缺陷软件缺陷就是通常说的Bug,它是指在软件中存在的影响软件正常运行的问题3、软件缺陷产生的原因1、需求不明确和变更软件需求不清晰或者开发人员对需求理解偏差,导致软件设…

    2022年9月18日
    0
  • python转置矩阵代码_python 矩阵转置[通俗易懂]

    python转置矩阵代码_python 矩阵转置[通俗易懂]用python怎么实现矩阵的转置只能用循环自己写算法吗自带函数有可以算的吗或者网上的算法可以用的python矩阵转置怎么做?5.矩阵转置给定:L=[[1,2,3],[4,5,6]]用zip函数和列表推导式实现行列转deftranspose(L):T=[list(tpl)fortplinzip(*L)]returnTpython字符串如何变成矩阵进行矩阵转置如输入一串“…

    2022年5月5日
    58
  • 常见电子元器件的常用品牌汇总

    ​抽时间汇总了一些常见电子元器件常用品牌,大家在元器件选型时可以参考。电阻:Yageo国巨、Uniohm厚声、Walsin华新科、Fenghua风华、Ralec旺诠、KOA兴亚、Panasonic松下、AVX、Rohm罗姆、Samsung三星、TDK、TMTEC泰铭、Kyocera京瓷、PHYCOM飞元。电容:Yageo国巨、Samsung三星、Eyang宇阳、Murata村田、Taiyo太诱、Fenghua风华、Kyocera京瓷、HEC禾伸堂、Kemet基美、ISND华信安、AVX、TDK、Nich

    2022年4月4日
    78
  • pycharm怎么调试程序_简单辅助调试

    pycharm怎么调试程序_简单辅助调试我这里已经简单的创建了一个文件,为了浅显易懂,这里程序写的比较简单1.      运行程序首先,找到编辑窗口上面有一个向下方向的灰色箭头,点击它点击之后,选择第一个选项editConfigurations,然后在弹出的窗口的第一栏name栏取一个你想要的名字,接着在第二栏Script栏后面点击后面的…选择你刚刚编写的程序,然后点击ok。这个时候你会发现刚刚灰色箭头的后面的

    2022年8月26日
    5
  • 数据结构之栈

    一标准库stack的使用(1)stack成员函数(2)示例二C++实现栈数组实现的栈,能存储任意类型的数据

    2021年12月19日
    61
  • MySQL 修改字段类型或长度

    MySQL 修改字段类型或长度mysql>altertable表名modifycolumn字段名类型;例如数据库中address表city字段是varchar(30)修改类型可以用(谨慎修改类型,可能会导致原有数据出错)mysql> altertableaddressmodifycolumncitychar(30);修改长度可以用(修改长度,要保证不短与已有数据,以保证原有数

    2022年4月30日
    204

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号