T- MVP在项目中的使用
来源:互联网 发布:c语言flag怎么用 编辑:程序博客网 时间:2024/06/05 08:23
用了MVP也有一段时间了,最为深的体会就是,写代码的时候,整个思维很清晰,修改需求也变得较为简单,还有一个体会就是,复用性变强了。一开始看着网上的教程,就在项目中用MVP,写了几个界面,发现增加类的量不是一般的多,类一多就会觉得,一点也不简洁;于是,便有了T-MVP。
实现的效果图:
项目结构,大概是这样的:
1、用泛型实现MVP的大瘦身
MVP给人的第一感觉就是要写很多类,很多接口;如果一下基础接口用泛型写,则可以免去重复写接口的繁琐。
- 几个基础接口
public interface EasyOnListener<T> { void getSuccess(T T); void getFail(T T);}
public interface IEasyBiz<T> { void getData(Context context, T T,EasyOnListener onListener);}
public interface IEasyView<T> { T getData(); void getSuccess(int type, T T); void getFaild(int type, T T); void showLoading(); void hideLoading(); void noConnet(); void isConnect();}
2、T-MVP的项目使用
Demo中用到的数据接口来自聚合数据提供的免费接口;数据结构大概是这样的:
用Android Studio的GsonFormat可以将Json快速生成实体类;
- 有了接口、实体类,接下来就是请求接口,得到数据,Demo中用到网络请求是Volley,解析Json用的是Gson,代码如下:
public class DataBiz implements IEasyBiz { @Override public void getData(Context context, Object T, final EasyOnListener onListener) { MyJsonObjectRequest json = new MyJsonObjectRequest(BaseMethod.dataUrl, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { try { if ("200".equals(response.getString("resultcode"))) { Gson gson = new Gson(); DataBean dataBean = gson.fromJson(response.toString(), DataBean.class); onListener.getSuccess(dataBean); } else { onListener.getFail(1); } } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { onListener.getFail(2); } }); VolleyController.getInstance(context).addToRequestQueue(json); }}
- 请求网络得到的数据交给Presenter,用泛型的好处在于Model层得到数据交给Presenter层的时候,可以用泛型代替所有的实体类,从而不用每一个界面都写接口,Presenter层的代码如下:
public class DataPresenter { private IEasyView iEasyView; private DataBiz dataBiz; public final static int NOCONNECT = 1; public final static int GETFAILED = 2; public final static int GETSUCCESS = 1; public DataPresenter(IEasyView iEasyView) { this.iEasyView = iEasyView; this.dataBiz = new DataBiz(); } public void getList(Context context) { if (!NetUtils.isNetworkConnected(context)) { iEasyView.getFaild(NOCONNECT,null); iEasyView.hideLoading(); } else { iEasyView.isConnect(); iEasyView.showLoading(); dataBiz.getData(context, iEasyView.getData(), new EasyOnListener() { @Override public void getSuccess(Object T) { iEasyView.hideLoading(); iEasyView.getSuccess(GETSUCCESS, T); } @Override public void getFail(Object T) { iEasyView.hideLoading(); int type = (int) T; switch (type){ case 1: iEasyView.getFaild(GETFAILED,null); break; case 2: iEasyView.getFaild(NOCONNECT,null); break; } } }); } }}
- Presenter层将数据交给View层,让View层做视图加载
public class SimpleRecyclerView extends AppCompatActivity implements IEasyView { @Bind(R.id.rv_simple) RecyclerView rvSimple; @Bind(R.id.ll_noconnect) LinearLayout llNoconnect; @Bind(R.id.ll_loading) LinearLayout llLoading; @Bind(R.id.tv_change) TextView tvChange; private int count = 0; private DataPresenter presenter; private SimpleAdapter adapter; private List<DataBean.ResultBean.FutureBean> mList = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_simple_recycler_view); ButterKnife.bind(this); setList(0); presenter = new DataPresenter(this); presenter.getList(this); } private void setList(int type) { if (type == 0) { LinearLayoutManager manager = new LinearLayoutManager(this); manager.setOrientation(LinearLayoutManager.VERTICAL); rvSimple.setLayoutManager(manager); } else if (type == 1) { GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2); rvSimple.setLayoutManager(gridLayoutManager); } } @Override public Object getData() { return null; } @Override public void getSuccess(int type, Object T) { switch (type) { case GETSUCCESS: DataBean dataBean = (DataBean) T; List<DataBean.ResultBean.FutureBean> list = dataBean.getResult().getFuture(); mList.addAll(list); if (adapter == null) { adapter = new SimpleAdapter(this, mList); rvSimple.setAdapter(adapter); } else { adapter.notifyDataSetChanged(); } break; } } @Override public void getFaild(int type, Object T) { switch (type) { case NOCONNECT: noConnet(); break; case GETFAILED: ToastUtil.showToast(this, "请求数据失败"); break; } } @Override public void showLoading() { llLoading.setVisibility(View.VISIBLE); } @Override public void hideLoading() { llLoading.setVisibility(View.GONE); } @Override public void noConnet() { llNoconnect.setVisibility(View.VISIBLE); ToastUtil.showErro(this); } @Override public void isConnect() { llNoconnect.setVisibility(View.GONE); } @OnClick({R.id.tv_change, R.id.ll_noconnect}) public void onClick(View view) { switch (view.getId()) { case R.id.tv_change: count++; setList(count % 2); adapter.notifyDataSetChanged(); break; case R.id.ll_noconnect: presenter = new DataPresenter(this); presenter.getList(this); break; } }}
总结
MVP的好处之一就是复用性很高,像获取用户信息这样一个网络请求,在app中肯定有很多处会用到,如果用这种写法,就可以避免每次用到都做网络请求,当然,这只是好处之一。用泛型,能够更加灵活地处理各种情况,也可以减少相当多的类。
2 0
- T- MVP在项目中的使用
- MVP模式在Android项目中的使用
- MVP模式在Android项目中的使用
- MVP模式在Android项目中的使用
- MVP模式在Android项目中的使用
- MVP模式在Android项目中的使用
- MVP模式在项目中的使用
- MVP模式在Android项目中的使用
- MVP模式在Android项目中的使用
- MVP模式在Android项目中的使用
- MVP模式在Android项目中的使用
- MVP模式在Android项目中的使用
- MVP模式在Android项目中的使用
- MVP模式在Android项目中的使用
- Android MVP 在项目中的使用 以及demo
- MVP在RecyclerView中的使用
- MVP在Android项目中的简单体现
- IOS (oc) 浅谈MVP在ios项目中的使用以及Demo
- 我的Android进阶之旅------>Android Studio使用statistics插件统计项目代码总行数
- 练手项目
- HashMap源码剖析
- 摄像头采集方案概述
- 使用collectd监控更改采集间隔时间
- T- MVP在项目中的使用
- AndroidStudio调试技巧
- 经典递归汉诺塔
- Tween 补间动画
- TextView相关
- 为什么要用实现接口的类实例化接口呢
- 接口和自定义观察者模式
- spring bom 解决spring依赖多版本问题
- IOS中 UIFont 字体大全