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的资源模式,资源暂不会上传,如有需要的直接联系本人,

1 0