初探MVP

今天估計(jì)是這學(xué)期最后一天花這么多時(shí)間在Android上了,因?yàn)榻酉聛淼囊欢螘r(shí)間里酵紫,我將會(huì)不斷的考試不斷的做實(shí)驗(yàn)不斷的課程設(shè)計(jì)扒最,而偏偏我是個(gè)學(xué)粉丑勤。。學(xué)渣已經(jīng)形容不了我了吧趣,現(xiàn)在的狀態(tài)真的是渣都不剩了法竞。不過還好還好有自己喜歡的事,有事沒事可以看看書看看博客撩撩妹强挫。今天寫一下關(guān)于MVP架構(gòu)的岔霸,我盡量將我這個(gè)初學(xué)者思考過程說清楚。不扯淡先看看今天的demo的預(yù)覽圖俯渤。

阿拉蕾
開波

本來我也想先給大家說說什么是MVC然后MVP怎樣來的呆细,然后摔出一大堆官方的文檔,接著說自己的感受八匠。但是這些基本那些介紹MVP的博文都會(huì)說到絮爷,我就不說了诡曙,因?yàn)?strong>MVC的話,個(gè)人覺得你在寫大一點(diǎn)的Demo時(shí)自然而然的就會(huì)抽取提煉略水,那大概就是MVC了吧价卤?大差不差。那么什么是MVP呢渊涝?下面po圖(第一次畫圖我知道丑不過先將就著吧):

MVP

上面的圖其實(shí)已經(jīng)說清楚了什么是MVP

  1. View層僅負(fù)責(zé)加載視圖(Activity or Fragment)與用戶交互(鍵盤輸入),不處理業(yè)務(wù)邏輯慎璧。
  2. Model層負(fù)責(zé)處理業(yè)務(wù)。
  3. Presenter層負(fù)責(zé)控制兩者之間的交往跨释?(用這個(gè)次準(zhǔn)確嗎)胸私,因此Presenter必須揣有ViewModel的實(shí)例。
    要點(diǎn)就這三點(diǎn)鳖谈,下面在代碼中說明吧岁疼。

中場

看代碼總是最輕松的,下圖即為demo的java文件缆娃。


Demo

我先介紹一下各部分的作用:

  1. config因?yàn)榇舜雾槑?fù)習(xí)了一溜Retorfit,所以CallServiceRetrofit的接口捷绒,Config則是我在聚合數(shù)據(jù)拿的一個(gè)新聞APi。在此謝謝阿里媽媽和馬云爹爹贯要。
  2. model是業(yè)務(wù)層暖侨,里面有NewInfo這個(gè)接收解析后Json數(shù)據(jù)的實(shí)體bean,NewLogic則是業(yè)務(wù)邏輯處理類崇渗,INewCallBack是一個(gè)監(jiān)聽網(wǎng)絡(luò)請求后的回調(diào)字逗。
  3. presenter是用以給model和view交互的中間人
  4. view里面有一個(gè)定義給MainActivity使用的接口ViewLogic,通過此接口我們可以給界面添加交互所需的方法宅广。同時(shí)因?yàn)榻换バ枰獊碜?strong>model的數(shù)據(jù)葫掉,但是并不能直接拿到所以可以拿到Presenter實(shí)例間接獲取數(shù)據(jù)。當(dāng)然由圖可知通過此接口我們可以在Presenter拿到View的實(shí)例跟狱。
下面看代碼:

model層

  • NewLogic.java
/* 業(yè)務(wù)邏輯:分析可知功能僅僅為申請新聞數(shù)據(jù)*/
public class NewsLogic {

    private  CallService callService;

    public NewsLogic() {
        Retrofit mRetrofit = new Retrofit.Builder().baseUrl(Config.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create()).build();
        callService = mRetrofit.create(CallService.class);
    }

    public void getNew(Map<String,String> map, final INewCallBack callBack){
        Call<NewInfo> call = callService.getNewInfo(map);

        call.enqueue(new Callback<NewInfo>() {
            @Override
            public void onResponse(Call<NewInfo> call, Response<NewInfo> response) {
                if (response.isSuccessful()){
                    callBack.onSucceed(response);
                }else{
                    callBack.onFailure("獲取新聞信息失敗");
                }
            }

            @Override
            public void onFailure(Call<NewInfo> call, Throwable t) {
                callBack.onFailure("獲取新聞信息失敗");
            }
        });
    }
}```
 * **NewInfo**這個(gè)類是通過**GsonFormat**解析的太長所以在這里不放了俭厚。

**View層**
**ViewLogic.java**

public interface ViewLogic {

//顯示加載bar
void showProgress();

//隱藏加載bar
void hideProgress();

//顯示新聞內(nèi)容
void showInfo(NewInfo newInfo);

//獲取失敗時(shí)操作
void showError(String 獲取新聞信息失敗);

}```
MainActivity.java

public class MainActivity extends AppCompatActivity implements ViewLogic {

    //一些聲明
    private Button mButton;
    private Presenter mPresenter = new Presenter(this);/*獲取Presenter實(shí)例間接貨物model數(shù)據(jù)*/
    private ProgressBar mProgress;
    private TextView mTitle,mTime;
    private ImageView img;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();/*初始化控件*/
    }

    private void init() {
        mTitle = (TextView) findViewById(R.id.title);
        mTime = (TextView) findViewById(R.id.time);
        img = (ImageView) findViewById(R.id.img);
        mProgress = (ProgressBar) findViewById(R.id.progress);
        mButton = (Button) findViewById(R.id.btn_get);

        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mPresenter.getInfo();/*獲取新聞數(shù)據(jù)*/
            }
        });
    }

    @Override
    public void showProgress() {
        mProgress.setVisibility(View.VISIBLE);/*顯示加載條*/
    }

    @Override
    public void hideProgress() {
        mProgress.setVisibility(View.GONE);/*隱藏加載條*/
    }

    /***
     * 顯示新聞數(shù)據(jù)
     * @param newInfo
     */
    @Override
    public void showInfo(NewInfo newInfo) {
        mTitle.setText(newInfo.getResult().getData().get(0).getTitle());
        mTime.setText(newInfo.getResult().getData().get(0).getDate());
        Picasso.with(this).load(newInfo.getResult().getData().get(0).getThumbnail_pic_s()).into(img);
    }

    /**
     * 獲取出錯(cuò)時(shí)
     * @param 獲取新聞信息失敗
     */
    @Override
    public void showError(String 獲取新聞信息失敗) {
        Toast.makeText(this, "獲取新聞信息失敗", Toast.LENGTH_SHORT).show();
    }
}```
 * Activity僅僅用以加載視圖和與用戶交互沒有過多的業(yè)務(wù)邏輯處理。

**Presenter層**
**Presenter.java**

public class Presenter {

//y必須擁有molde層和view層實(shí)例
private NewsLogic mNewsLogic;
private ViewLogic mViewLogic;

public Presenter(ViewLogic viewLogic) {
    mViewLogic = viewLogic;
    mNewsLogic = new NewsLogic();
}
//功能只有獲取數(shù)據(jù)
public void getInfo(){
    mViewLogic.showProgress();
    HashMap<String, String> map = new HashMap<>();
    map.put("type","tiyu");
    map.put("key", Config.KEY);
    mNewsLogic.getNew(map, new INewCallBack() {
        @Override
        public void onSucceed(Response<NewInfo> response) {
            NewInfo newInfo = response.body();
            mViewLogic.hideProgress();
            mViewLogic.showInfo(newInfo);
        }

        @Override
        public void onFailure(String 獲取新聞信息失敗) {
            mViewLogic.hideProgress();
            mViewLogic.showError(獲取新聞信息失敗);
        }
    });
}

}```

下半場

其實(shí)也可以通過一個(gè)不太恰當(dāng)?shù)睦觼黻U述什么是MVP兽肤,我們可以把View看作現(xiàn)流行的網(wǎng)紅女主播套腹,在MVC的時(shí)代绪抛,咱們的主播除了展示自己美好的身材以外资铡,還需要不斷的說“喜歡主播的寶寶可以點(diǎn)亮,送的禮物越多主播的浮力越大哦”(此看作邏輯處理)幢码,這樣就會(huì)造成咱們的女主播一邊喊一邊應(yīng)付浮力多辛苦笤休,但是在MVP的時(shí)代,以上邏輯交給了中間人Presenter症副,也就是場館在不斷的發(fā)彈幕處理之前需要主播處理的業(yè)務(wù)邏輯店雅,而咱們的女主播呢政基,就可以專心的表演了僅僅充當(dāng)加載視圖的功能。如果大家不相信闹啦,可以下載個(gè)直播軟件試試哈(我是不是暴露了什么哈哈哈沮明。。窍奋。)荐健,這個(gè)例子不知道準(zhǔn)不準(zhǔn)確,但是以我初學(xué)者的眼神大差不差琳袄。今天的筆記就寫到這里了江场,不知道是否說得明白,大家也在github上下載我的demo來看看窖逗。我的github地址址否。


運(yùn)行效果:
效果
如果你覺得本文有所錯(cuò)漏,麻煩留言指出碎紊,交流學(xué)習(xí)共同進(jìn)步佑附。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市仗考,隨后出現(xiàn)的幾起案子帮匾,更是在濱河造成了極大的恐慌,老刑警劉巖痴鳄,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘟斜,死亡現(xiàn)場離奇詭異,居然都是意外死亡痪寻,警方通過查閱死者的電腦和手機(jī)螺句,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來橡类,“玉大人蛇尚,你說我怎么就攤上這事」嘶” “怎么了取劫?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長研侣。 經(jīng)常有香客問我谱邪,道長,這世上最難降的妖魔是什么庶诡? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任惦银,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扯俱。我一直安慰自己书蚪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布迅栅。 她就那樣靜靜地躺著殊校,像睡著了一般。 火紅的嫁衣襯著肌膚如雪读存。 梳的紋絲不亂的頭發(fā)上箩艺,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音宪萄,去河邊找鬼艺谆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拜英,可吹牛的內(nèi)容都是我干的静汤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼居凶,長吁一口氣:“原來是場噩夢啊……” “哼虫给!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起侠碧,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤抹估,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后弄兜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體药蜻,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年替饿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了语泽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡视卢,死狀恐怖踱卵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情据过,我是刑警寧澤惋砂,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站绳锅,受9級(jí)特大地震影響西饵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜榨呆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一罗标、第九天 我趴在偏房一處隱蔽的房頂上張望庸队。 院中可真熱鬧积蜻,春花似錦闯割、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至丙笋,卻和暖如春谢澈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背御板。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來泰國打工锥忿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人怠肋。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓敬鬓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親笙各。 傳聞我的和親對象是個(gè)殘疾皇子钉答,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,300評(píng)論 25 707
  • Android App的設(shè)計(jì)架構(gòu):MVC,MVP,MVVM與架構(gòu)經(jīng)驗(yàn)談1. 架構(gòu)設(shè)計(jì)的目的1.1 通過設(shè)計(jì)使程序模...
    天空在微笑閱讀 4,151評(píng)論 1 20
  • 我身邊的很多事情都是世俗的 我不停希望 祈求它可以有一個(gè)不落俗套意外的結(jié)局 水落石出的都世俗了 沒有結(jié)果的我繼續(xù)祈求著啊
    雀杏閱讀 209評(píng)論 0 0
  • 她,就一個(gè)人靜靜地坐在角落里杈抢,一聲也不吭数尿。這會(huì)球場上有多場比賽,時(shí)而會(huì)出現(xiàn)精彩的好球惶楼,別人都在鼓掌叫好右蹦,她依舊面無...
    找伴運(yùn)動(dòng)閱讀 315評(píng)論 0 1