Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android三大設計模式之一----MVP設計模式(包括rxjava+retrofit網絡請求框架)

Android三大設計模式之一----MVP設計模式(包括rxjava+retrofit網絡請求框架)

編輯:關於Android編程

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 (@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() {
            @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,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 mUserVo = (List) 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=/uploadfile/2016/0831/20160831091311760.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=/uploadfile/2016/0831/20160831091311760.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>() {
                        }.getType();
                        List 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. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved