Android三大设计模式之一------------------MVP设计模式(包括rxjava+retrofit网络请求框架)
来源:互联网 发布:p2p网络金融平台 编辑:程序博客网 时间:2024/04/30 20:19
android的开发模式,也就是项目最基本的构建模式,也不是说需要固定不变的模式,在项目中可以灵活运用。
而MVP开发模式属于MVC的变种升级,其相对于mvc模式来说,更高度的解耦,更明确的分工,可以更好的开发项目,结构十分清晰,适合安卓升级之后包括android5.0,6.0的开发,
mvp同样是有名字组成,model(模型),view(视图),presenter(纽带),其三者之间的关系,大致是有如下图一样的关系:
即最早是view与presenter最先交互,然后model直接与presenter直接交互,然后再通过presenter与view返回交互,三者之间presenter于两者互相交互,而model与view没有直接的交互,这是不同于mvc的循环交互模式。
然后做了一个小demo通过该模式,来讲解该开发模式
然后我们直接来看项目设计,通过代码来理解MVP模式的使用
model,就是该项目的逻辑处理的详细分工,如下:
该model为根据用户需求,通过接手personter传递给我们的需要从而返回,后台传递给我们的实体类
bean中文件为,新建类,biz提供接口做网络请求的主要操作,service提供api的作用,根据mvp与rxjava和retrofit的网络请求。
先从business入手。
public interface IBusiness { /** * 注册 * @param mUserVo:请求参数:封装为bean * @param mICallBackListener:回调接口 */ public void search(String key, ICallBackListener mICallBackListener);}
//public class Business implements IBusiness { @Override public void register(String key, ICallBackListener mICallBackListener) { IServiceAPI mIServiceAPI = HttpDao.getInstance().getIServiceAPI(); mIServiceAPI.register(key) // Subscriber前面执行的代码都是在I/O线程中运行 .subscribeOn(Schedulers.io()) // 操作observeOn之后操作主线程中运行. .observeOn(AndroidSchedulers.mainThread()) .subscribe(HttpDao.getInstance().createSubscriber(mICallBackListener)); }}这是直接从presenter调用的方法,里面通过service里面的服务进行
public interface IServiceAPI { // 注册 @FormUrlEncoded @POST("words") Observable<String> (@Field("key") String key);}
callbacklinseter中的方法,即
public interface ICallBackListener { public void onSuccess(CallBackVo mCallBackVo); public void onFaild(CallBackVo mCallBackVo);}
CallBackVo即返回的数据基本类型
public class CallBackVo { String error_code; String reason; Object result; public String getError_code() { return error_code; } public void setError_code(String error_code) { this.error_code = error_code; } public String getReason() { return reason; } public void setReason(String reason) { this.reason = reason; } public Object getResult() { return result; } public void setResult(Object result) { this.result = result; }}
然后就是httpdao层的
public class HttpDao { private static final String TAG = HttpDao.class.getSimpleName(); private static HttpDao mHttpDao = null; private HttpDao(){}; public static HttpDao getInstance(){ if (mHttpDao == null) { mHttpDao = new HttpDao(); } return mHttpDao; } /** * 获取 IServiceAPI实列 * @return IServiceAPI */ public IServiceAPI getIServiceAPI() { // 使用自定义转换器 Gson mGson = new GsonBuilder() .registerTypeAdapter(String.class, new DeserializerData()) .create(); Retrofit mRetrofit = new Retrofit.Builder() .baseUrl(AppConstant.URL_HOST) .addConverterFactory(GsonConverterFactory.create(mGson)) //build.gradle引入:compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4' .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); return mRetrofit.create(IServiceAPI.class); } /** * 创建 Subscriber * @param mICallBackListener * @return Subscriber */ public Subscriber createSubscriber(final ICallBackListener mICallBackListener) { Subscriber mSubscriber = new Subscriber<String>() { @Override public void onCompleted() { Log.i(TAG, "[onCompleted]"); } @Override public void onError(Throwable e) { Log.e(TAG, "[onError]" + e.getMessage()); CallBackVo mCallBackVo = new CallBackVo(); mCallBackVo.setError_code("400"); mCallBackVo.setReason("请求失败"); mCallBackVo.setResult(null); mICallBackListener.onFaild(mCallBackVo); return; } @Override public void onNext(String s) { Log.i(TAG, "[onNext]" + s); Gson gosn = new Gson(); CallBackVo mCallBackVo = gosn.fromJson(s, CallBackVo.class); if (mCallBackVo.getError_code().equals(AppConstant.REQUEST_SUCCESS_CODE)) { mICallBackListener.onSuccess(mCallBackVo); } else { mICallBackListener.onFaild(mCallBackVo); } } }; return mSubscriber; }}
view层,就是该项目与用户进行交互的主要负责,获取用户需求,显示用户需要,如下:
activity即为基本的activity
@EActivity(R.layout.activity_fragment_main_toolbar)public class TestActivity extends AxBaseFragmentActivity { private TestFragment mTestFragment; @AfterViews public void initView() { mTestFragment = (TestFragment) getSupportFragmentManager().findFragmentById(R.id.contentFrame); if (mTestFragment == null) { // mTestFragment = TestFragment_.builder().build(); // addFragmentToActivity(getSupportFragmentManager(), mTestFragment, R.id.contentFrame); } // Create the presenter new TestPresenter(mTestFragment); }}
然后delegate,主要是定义view层和personter层需要的方法,进行统一管理
public interface TestDelegate { interface View extends AxBaseDelegate.AxIView<Presenter>,AxBaseDelegate.AxIFragment{ public void closeProgress(); public void showProgress(); public String getParamenters(); public void excuteSuccessCallBack(CallBackVo mCallBackVo); public void excuteFailedCallBack(CallBackVo mCallBackVo); } interface Presenter extends AxBaseDelegate.AxIPresenter{ public IBusiness mIBusiness = new Business(); public Handler mHandler = new Handler(); }}然后是fragment中的
@EFragment(R.layout.mainlayout)public class TestFragment extends BaseFragment implements TestDelegate.View{ private TestDelegate.Presenter mPresenter; private Dialog mDialog; @ViewById RecyclerView recyclerView; @AfterViews public void initview(){ } @Override public void initPresenter(TestDelegate.Presenter presenter) { mPresenter = presenter; } @Override public String getParamenters() { return "3addff781b814fa48142f76922dca6df"; } @Override public void excuteSuccessCallBack(CallBackVo mCallBackVo) { List<UserVo.ResultEntity> mUserVo = (List<UserVo.ResultEntity>) mCallBackVo.getResult(); NewsAdapter newsAdapter = new NewsAdapter(getActivity(),mUserVo); recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); recyclerView.setAdapter(newsAdapter); for (int i = 0; i < mUserVo.size(); i++) { Log.e("TAg","--"+mUserVo.get(i).Id); Log.e("TAg","--"+mUserVo.get(i).KeyWord); } } @Override public void excuteFailedCallBack(CallBackVo mCallBackVo) { Log.e("TAG",mCallBackVo.getReason()); } @Click({R.id.btn}) public void onClick(View view){ if (view.getId() == R.id.btn){ AppConstant.URL_HOST = "http://apis.haoservice.com/lifeservice/news/"; mPresenter.init(); Log.e("Tag","----------"); //测试图片加载// Glide.with(getActivity())// .load("https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1471937376&di=bc91d6b0a8668d4df18a52f87c5e1c8d&src=http://img03.tooopen.com/images/20130516/tooopen_06463339.jpg")// .error(R.drawable.ic_launcher)// .placeholder(R.drawable.actionbar_add_btn)// .into(iv);// UgcTvApp.getInstance().getAxImageLoader().displayImage(getActivity(), "https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1471937376&di=bc91d6b0a8668d4df18a52f87c5e1c8d&src=http://img03.tooopen.com/images/20130516/tooopen_06463339.jpg", iv); } } public void showProgress() { mDialog = new ProgressDialog(getActivity()); mDialog.show(); } public void closeProgress() { mDialog.dismiss(); }}
presenter层,就是该项目的纽带了,与另外两层进行交互
该TestPresenter的代码
public class TestPresenter implements TestDelegate.Presenter { private TestDelegate.View mView; public TestPresenter(TestDelegate.View view) { // mView = view; // mView.initPresenter(this); } @Override public void init() { mView.showProgress(); mIBusiness.search(mView.getParamenters(), new ICallBackListener() { @Override public void onSuccess(final CallBackVo mCallBackVo) { mHandler.post(new Runnable() { @Override public void run() { Gson mGson = new Gson(); JsonElement mJsonElement = mGson.toJsonTree(mCallBackVo.getResult()); Type mType = new TypeToken<List<UserVo.ResultEntity>>() { }.getType(); List<UserVo.ResultEntity> mRegisterVo = mGson.fromJson(mJsonElement, mType); mCallBackVo.setResult(mRegisterVo); mView.closeProgress(); mView.excuteSuccessCallBack(mCallBackVo); } }); } @Override public void onFaild(final CallBackVo mCallBackVo) { mHandler.post(new Runnable() { @Override public void run() { mView.closeProgress(); mView.excuteFailedCallBack(mCallBackVo); Log.e("Tag",mCallBackVo.getReason()); } }); } }); }}
这些大致就是所有mvp架构包括rxjava+retrofit开发模式架构
对于项目开发的优势还是很明显的,高度的解耦,清晰的项目结构,对于开发都非常赏心悦目了,嘎嘎
虽然搭建的时候可能觉得很复杂,但其实上是很清晰的在后续的开发中,非常有利于跟进,
对于中大型项目有非常大的优势,希望大家可以多多指点,可以在评论中指出。
另外本文有参考其他项目的内容,对于rxjava+retrofit,非常感谢。
之后还会总结一篇mvvm框架方面的内容,
另外介于CSDN的资源模式,资源暂不会上传,如有需要的直接联系本人,
- Android三大设计模式之一------------------MVP设计模式(包括rxjava+retrofit网络请求框架)
- 浅谈Android MVP设计模式(简单结合RxJava+Retrofit)
- Android Mvp设计模式结合RxJava+OkHttp+retrofit浅谈
- Android 一步步搭建MVP+Retrofit+RxJava网络请求框架
- Android 搭建MVP+Retrofit+RxJava网络请求框架
- 网络请求框架 Rxjava+ReTrofit+okHttp+MVP
- Okhttp3网络请求框架+MVP设计模式简单实战
- android+MVP+Retrofit+RxJava做网络请求
- Android三大设计模式之一------------------MVC设计模式
- Android三大设计模式之一------------------MVC设计模式
- Android中RxJava+Retrofit+MVP模式的整合(1)—目录设计
- Android 单例模式封装 RxJava+Retrofit 网络请求
- kotlin for android----------MVP模式下(OKHttp和 Retrofit+RxJava)网络请求的两种实现方式
- MVP框架使用Retrofit+Rxjava请求网络数据
- 一步步搭建Retrofit+RxJava+MVP网络请求框架(一)
- 一步步搭建Retrofit+RxJava+MVP网络请求框架(一)
- Android 设计模式之一:MVP模式与MVC模式
- Android 网络请求框架之Rxjava+Retrofit
- 简单理解ShadowMap阴影的实现
- iOS各种多线程方法的使用总结
- mp4快速重新封装为isom格式
- linux下日志切分
- 正则表达式
- Android三大设计模式之一------------------MVP设计模式(包括rxjava+retrofit网络请求框架)
- Online ASCII Banner Generator
- 成像质量测试项目及测试方式
- linux查看端口被占用情况
- 安卓学习笔记---将Activity打成jar包供第三方调用(解决资源文件不能打包的问题)
- 认清Android框架 MVC,MVP和MVVM
- iOS tableView 设置选中type样式
- 通过CQRS/事件溯源框架Reveno实现高负载交易事务处理(Reveno)
- FastJson Jackson Gson使用教程