admin管理员组文章数量:1568354
在我看来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
方便代码的维护和单元测试。
以下主要展示的功能和框架有:
- MVP架构+基类+Volley封装
- 底部标签与Fragment的联动
- arguments动态传值
- 接口回调
- js交互,有参无参调用,弹框
- 自定义全局异常捕获
- 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
版权声明:本文标题:安卓开发电商mvp框架和流式布局,搜索框 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1726160964a1057799.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论