安卓开发电商mvp框架和流式布局,搜索框

在这里插入图片描述
在我看来mvp框架其实是mvc框架变种产品。讲原本的activity/fragment的层次划分成present层和view层。m还是原来的实体层用来组装数据,p层则用来隔离view层,被称为中介层,v层还是view层主要用来展示数据的层。如下图所示:

有了present层之后呢?view层就专心在activity/fragment里面主要去处理视图层和维护自己的生命周期,将业务逻辑委托给present层,present层作为实体层和视图层的中介。实体层和视图层不直接进行交互,而是通过委托给persent层进行交互,这样做的好处是:

分离了视图逻辑和业务逻辑,降低了耦合
Activity只处理生命周期的任务,代码变得更加简洁
视图逻辑和业务逻辑分别抽象到了View和Presenter的接口中去,提高代码的可阅读性
Presenter被抽象成接口,可以有多种具体的实现,所以方便进行单元测试
把业务逻辑抽到Presenter中去,避免后台线程引用着Activity导致Activity的资源无法被系统回收从而引起内存泄露和OOM
方便代码的维护和单元测试。

在这里插入图片描述

以下主要展示的功能和框架有:

  1. MVP架构+基类+Volley封装
  2. 底部标签与Fragment的联动
  3. arguments动态传值
  4. 接口回调
  5. js交互,有参无参调用,弹框
  6. 自定义全局异常捕获
  7. base封装Activity和Fragment

第一步:添加需要的依赖和权限创建App上下文管理类,创建全局异常捕获类

在build.gradle下加依赖

 implementation 'com.google.code.gson:gson:2.8.5'
    //volley请求框架
    implementation 'com.android.volley:volley:1.1.1'

    //recycelrview,列表控件,和listview差不多,升级版
    implementation 'androidx.recyclerview:recyclerview:1.1.0'


//glidee
    implementation("com.github.bumptech.glide:glide:4.10.0") {
   
        exclude group: "com.android.support"
    }

在清单文件加联网权限

<uses-permission android:name="android.permission.INTERNET" />

App

public class App extends Application {
   


    private static Context context;
    @Override
    public void onCreate() {
   
        super.onCreate();

        //设置全局异常类,先创建在设置
        final MyCanshHandle myCanshHandle = new MyCanshHandle();

        Thread.setDefaultUncaughtExceptionHandler(myCanshHandle);
        context=getApplicationContext();
    }

    public static Context getContext() {
   
        return context;
    }
}

全局异常捕获类MyCanshHandle

public class MyCanshHandle implements Thread.UncaughtExceptionHandler {
   
    @Override
    public void uncaughtException(@NonNull Thread thread, @NonNull Throwable throwable) {
   

        Log.e("xx",throwable.getMessage());
    }
}

第二步:base封装mvp框架 创建Entity类

Entity类

FlowEntity

public class FlowEntity {
   


    /**
     * msg : 响应成功
     * code : 200
     * tags : ["手机壁纸","手机app","手机cpu天梯图","手机号码测吉凶","手机新浪网","手机号码测吉凶(超准)","手机电影","手机在线","手机排名","小米手机"]
     */

    private String msg;
    private int code;
    private List<String> tags;

    public String getMsg() {
   
        return msg;
    }

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

    public int getCode() {
   
        return code;
    }

    public void setCode(int code) {
   
        this.code = code;
    }

    public List<String> getTags() {
   
        return tags;
    }

    public void setTags(List<String> tags) {
   
        this.tags = tags;
    }

ProductEntivity

public class ProductEntivity {
   


    /**
     * result : [{"commodityId":172,"commodityName":"艾奔AspenSpor新款大容量男士双肩包学生书包防盗电脑包充电旅行背包 黑色_标准版","masterPic":"http://172.17.8.100/images/small/commodity/xbsd/dnb/3/1.jpg","price":89,"saleNum":0},{"commodityId":188,"commodityName":"赫登尔(herder)双肩包男时尚旅行背包学生书包电脑包大容量潮流男包0902A","masterPic":"http://172.17.8.100/images/small/commodity/xbsd/sjb/5/1.jpg","price":169,"saleNum":0},{"commodityId":118,"commodityName":" 新款 iPad 128G WIFI 版 平板电脑","masterPic":"http://172.17.8.100/images/small/commodity/sjsm/yyyl/5/1.jpg","price":2988,"saleNum":0},{"commodityId":184,"commodityName":"瑞士军刀双肩包男士背包新款大容量休闲商务旅行电脑包学生书包 USb充电包","masterPic":"http://172.17.8.100/images/small/commodity/xbsd/sjb/1/1.jpg","price":99,"saleNum":0},{"commodityId":174,"commodityName":"帆布派 Canvas artisan 苹果笔记本电脑包 女14/15.6寸惠普电脑包联想1 PT38-1酒红色 14寸可用","masterPic":"http://172.17.8.100/images/small/commodity/xbsd/dnb/5/1.jpg","price":229,"saleNum":0}]
     * message : 查询成功
     * status : 0000
     */

    private String message;
    private String status;
    private List<ResultBean> result;

    public String getMessage() {
   
        return message;
    }

    public void setMessage(String message) {
   
        this.message = message;
    }

    public String getStatus() {
   
        return status;
    }

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

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

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

    public static class ResultBean {
   
        /**
         * commodityId : 172
         * commodityName : 艾奔AspenSpor新款大容量男士双肩包学生书包防盗电脑包充电旅行背包 黑色_标准版
         * masterPic : http://172.17.8.100/images/small/commodity/xbsd/dnb/3/1.jpg
         * price : 89
         * saleNum : 0
         */

        private int commodityId;
        private String commodityName;
        private String masterPic;
        private int price;
        private int saleNum;

        public int getCommodityId() {
   
            return commodityId;
        }

        public void setCommodityId(int commodityId) {
   
            this.commodityId = commodityId;
        }

        public String getCommodityName() {
   
            return commodityName;
        }

        public void setCommodityName(String commodityName) {
   
            this.commodityName = commodityName;
        }

        public String getMasterPic() {
   
            return masterPic;
        }

        public void setMasterPic(String masterPic) {
   
            this.masterPic = masterPic;
        }

        public int getPrice() {
   
            return price;
        }

        public void setPrice(int price) {
   
            this.price = price;
        }

        public int getSaleNum() {
   
            return saleNum;
        }

        public void setSaleNum(int saleNum) {
   
            this.saleNum = saleNum;
        }
    }
}

m层:
暂时没用到所以只创建一个接口即可

public interface IBaseModel {
   
}

v层
也暂时没用到所以只创建一个接口即可

public interface IBaseView {
   
}

p层

public abstract class BasePresenter<M extends IBaseModel,V extends IBaseView> {
   

    public M model;
    public WeakReference<V> weakReference;


    public BasePresenter(){
   
        model=initModel();
    }

    //绑定view
    public void attch(V v){
   
        weakReference=new WeakReference<>(v);
    }

    protected abstract M initModel();


    //解绑view,解决内存泄露
    public void deach(){
   
        if (weakReference!=null){
   
            weakReference.clear();
            weakReference=null;
        }

    }

    public V getview(){
   
        return weakReference.get();
    }
}

第三步:封装BaseActivity和BaseFragment类

BaseActivity

public abstract class BaseActivity<P extends BasePresenter> extends AppCompatActivity implements IBaseView {
   

    public P presenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);

        setContentView(layoutId());

        presenter=initPresenter();


        //绑定view
        if (presenter!=null){
   
            presenter.attch(this);
        }

        initView();

        initData();

    }


    //让子类创建
    protected abstract P initPresenter();

    protected abstract void initData();

    protected abstract void initView();

    protected abstract int layoutId();


    //解决内存泄漏
    @Override
    protected void onDestroy() {
   
        super.onDestroy();
        if (presenter!=null) {
   
            presenter.deach();
        }
    }
}

BaseFragment

public abstract class BaseFragment<P extends 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值