Android開發(fā)中的的MVP模式

MVP挂据,全稱 Model-View-Presenter
1滔吠,為什么使用MVP蚪黑?

1233754-5f7d98f12dc2496d.png

大部分的安卓應用只使用View-Model結構
程序員現(xiàn)在更多的是和復雜的View打交道而不是解決業(yè)務邏輯。
當你在應用中只使用Model-View時棋凳,到最后队橙,你會發(fā)現(xiàn)“所有的事物都被連接到一起”
god object
god object是十分復雜的坠陈,他的每一個部分都不能重復利用萨惑,無法輕易的測試、或者調試和重構仇矾。
使用 MVP
復雜的任務被分成細小的任務咒钟,并且很容易解決。越小的東西若未,bug越少,越容易debug倾鲫,更好測試粗合。在MVP模式下的View層將會變得簡單,所以即便是他請求數(shù)據(jù)的時候也不需要回調函數(shù)乌昔。View邏輯變成十分直接隙疚。

1233754-eb5b4bc4fbf757be.png

當你編寫一個Actviity、Fragment磕道、自定義View的時候供屉,你會把所有的和后臺任務相關的方法寫在一個靜態(tài)類或者外部類中。這樣溺蕉,你的Task不再和Activity聯(lián)系在一起伶丐,這既不會導致內存泄露,也不依賴于Activity的重建疯特。
這里有若干種方法處理后臺任務哗魂,但是它們的可靠性都不及MVP。
2漓雅,項目中MVP 代碼簡介
M:Model 數(shù)據(jù)層录别,主要負責項目中的數(shù)據(jù)處理 如訪問網絡數(shù)據(jù) 訪問數(shù)據(jù)庫數(shù)據(jù)等等
V:View 視圖層 主要負責視圖的顯示 開發(fā)中如Activity Fragment等等
P:Presenter 邏輯層 主要負責業(yè)務邏輯的處理 當然 也是連接Model層和View層的橋梁。
2.1 先寫一個協(xié)議類Contract邻吞,用來放Model層 View層 presenter層的接口以及回調接口

 //---------------------Master Role  My Disabuse  unAnswered fragemtn-------------------------------------
    public interface IUnAnswerModel {
        void loadUnAnswerData(RequestBody route,OnUnAnswerListener listener);
    }

    public interface OnUnAnswerListener {
        void onError();
        void onSuccessUnAnswerData(IgnoreBean bean);
    }

    public interface IUnAnswerView {
        void showError();
        void setUnAnswerData(IgnoreBean bean);
    }

    public interface IUnAnswerPresenter {
        void getUnAnswerData(RequestBody route);
    }

2.2 寫Model接口的實現(xiàn)類 這里進行訪問網絡的耗時操作


/**
 * Created by zhang on 2017/5/9.
 */
public class UnAnswerModelImpl implements PersonContract.IUnAnswerModel {
    @Override
    public void loadUnAnswerData(RequestBody route, final PersonContract.OnUnAnswerListener listener) {
        Retrofit retrofit = RetrofitSingleton.getInstance().getRetrofit();
        PersonService service = retrofit.create(PersonService.class);
        Call<IgnoreBean> call = service.getNoAnswer(route);
        call.enqueue(new Callback<IgnoreBean>() {
            @Override
            public void onResponse(Call<IgnoreBean> call, Response<IgnoreBean> response) {
                if (response != null && response.body() != null && response.body().getData() != null && response.body().getData().getResultData() != null) {
                    listener.onSuccessUnAnswerData(response.body());
                } else {
                    listener.onError();
                }
            }

            @Override
            public void onFailure(Call<IgnoreBean> call, Throwable t) {
                listener.onError();
            }
        });
    }
}

2.3 Presenter接口的實現(xiàn)類 該類持有Model實現(xiàn)類的對象和View實現(xiàn)類的對象 進行邏輯處理


/**
 * Created by zhang on 2017/5/9.
 */
public class UnAnswerPresenterImpl implements PersonContract.IUnAnswerPresenter,PersonContract.OnUnAnswerListener {

    private PersonContract.IUnAnswerView mIUnAnswerView;
    private PersonContract.IUnAnswerModel mIUnAnswerModel;

    public UnAnswerPresenterImpl(PersonContract.IUnAnswerView mIUnAnswerView) {
        this.mIUnAnswerView = mIUnAnswerView;
        this.mIUnAnswerModel = new UnAnswerModelImpl();
    }

    @Override
    public void getUnAnswerData(RequestBody route) {
        mIUnAnswerModel.loadUnAnswerData(route,this);
    }

    @Override
    public void onError() {
        mIUnAnswerView.showError();
    }

    @Override
    public void onSuccessUnAnswerData(IgnoreBean bean) {
        mIUnAnswerView.setUnAnswerData(bean);
    }
}

2.4 View 的實現(xiàn)類 也就是Activity或者Fragment

public class UnAnswerFragment extends Fragment implements PersonContract.IUnAnswerView {

該類中持有presenter實現(xiàn)類的對象 用來獲取數(shù)據(jù)

    private PersonContract.IUnAnswerPresenter mIUnAnswerPresenter;

實例化:
 mIUnAnswerPresenter = new UnAnswerPresenterImpl(this);

請求數(shù)據(jù):

private void initData() {
        mParamsBean = new CommentParamBean.ParamsBean();
        if (mType == ANSWERED) {
            mParamsBean.setStatus("1");

        } else {
            mParamsBean.setStatus("0");
        }
        mParamsBean.setHasPublic("true");
        mRequestBody = Utils.set5param(UserSingleton.getInstance(getContext()).getId(), 10, page, 2, mParamsBean);
        mIUnAnswerPresenter.getUnAnswerData(mRequestBody);
    }

請求數(shù)據(jù)后的回調方法


    @Override
    public void showError() {
        Logger.e("------請求數(shù)據(jù)失敗---------");
        mKProgressHUD.dismiss();
    }

    @Override
    public void setUnAnswerData(IgnoreBean bean) {
        Logger.e(bean.toString());
        List<IgnoreBean.DataBean.ResultDataBean> resultData = bean.getData().getResultData();
        totalPage = bean.getData().getPageModel().getTotalPage();
        if (isRefresh) {
            mList.clear();
        }
        mList.addAll(bean.getData().getResultData());
        mAdapter.notifyDataSetChanged();
        if (isRefresh) {
            isRefresh = false;
            mXRecyclerView.refreshComplete();
        } else {
            mXRecyclerView.loadMoreComplete();
        }
        mKProgressHUD.dismiss();

    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末组题,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子抱冷,更是在濱河造成了極大的恐慌崔列,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡本冲,警方通過查閱死者的電腦和手機钳榨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疮蹦,“玉大人,你說我怎么就攤上這事⊙端剑” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長斤寇。 經常有香客問我桶癣,道長,這世上最難降的妖魔是什么娘锁? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任牙寞,我火速辦了婚禮,結果婚禮上莫秆,老公的妹妹穿的比我還像新娘间雀。我一直安慰自己,他們只是感情好镊屎,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布惹挟。 她就那樣靜靜地躺著,像睡著了一般缝驳。 火紅的嫁衣襯著肌膚如雪连锯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天用狱,我揣著相機與錄音运怖,去河邊找鬼。 笑死齿拂,一個胖子當著我的面吹牛驳规,可吹牛的內容都是我干的。 我是一名探鬼主播署海,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼吗购,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了砸狞?” 一聲冷哼從身側響起捻勉,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎刀森,沒想到半個月后踱启,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡研底,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年埠偿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榜晦。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡冠蒋,死狀恐怖,靈堂內的尸體忽然破棺而出乾胶,到底是詐尸還是另有隱情抖剿,我是刑警寧澤朽寞,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站斩郎,受9級特大地震影響脑融,放射性物質發(fā)生泄漏。R本人自食惡果不足惜缩宜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一肘迎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锻煌,春花似錦膜宋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽史简。三九已至乃秀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間圆兵,已是汗流浹背跺讯。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留殉农,地道東北人刀脏。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像超凳,于是被迫代替她去往敵國和親愈污。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內容