初探MVP

今天估計是這學期最后一天花這么多時間在Android上了,因為接下來的一段時間里,我將會不斷的考試不斷的做實驗不斷的課程設計,而偏偏我是個學粉。。學渣已經形容不了我了,現在的狀態真的是渣都不剩了。不過還好還好有自己喜歡的事,有事沒事可以看看書看看博客撩撩妹。今天寫一下關于MVP架構的,我盡量將我這個初學者思考過程說清楚。不扯淡先看看今天的demo的預覽圖。

阿拉蕾
開波

本來我也想先給大家說說什么是MVC然后MVP怎樣來的,然后摔出一大堆官方的文檔,接著說自己的感受。但是這些基本那些介紹MVP的博文都會說到,我就不說了,因為MVC的話,個人覺得你在寫大一點的Demo時自然而然的就會抽取提煉,那大概就是MVC了吧?大差不差。那么什么是MVP呢?下面po圖(第一次畫圖我知道丑不過先將就著吧):

MVP

上面的圖其實已經說清楚了什么是MVP

  1. View層僅負責加載視圖(Activity or Fragment)與用戶交互(鍵盤輸入),不處理業務邏輯。
  2. Model層負責處理業務。
  3. Presenter層負責控制兩者之間的交往?(用這個次準確嗎),因此Presenter必須揣有ViewModel的實例。
    要點就這三點,下面在代碼中說明吧。

中場

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


Demo

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

  1. config因為此次順帶復習了一溜Retorfit,所以CallServiceRetrofit的接口,Config則是我在聚合數據拿的一個新聞APi。在此謝謝阿里媽媽和馬云爹爹。
  2. model是業務層,里面有NewInfo這個接收解析后Json數據的實體bean,NewLogic則是業務邏輯處理類,INewCallBack是一個監聽網絡請求后的回調。
  3. presenter是用以給model和view交互的中間人
  4. view里面有一個定義給MainActivity使用的接口ViewLogic,通過此接口我們可以給界面添加交互所需的方法。同時因為交互需要來自model的數據,但是并不能直接拿到所以可以拿到Presenter實例間接獲取數據。當然由圖可知通過此接口我們可以在Presenter拿到View的實例。
下面看代碼:

model層

  • NewLogic.java
/* 業務邏輯:分析可知功能僅僅為申請新聞數據*/
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**這個類是通過**GsonFormat**解析的太長所以在這里不放了。

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

public interface ViewLogic {

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

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

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

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

}```
MainActivity.java

public class MainActivity extends AppCompatActivity implements ViewLogic {

    //一些聲明
    private Button mButton;
    private Presenter mPresenter = new Presenter(this);/*獲取Presenter實例間接貨物model數據*/
    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();/*獲取新聞數據*/
            }
        });
    }

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

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

    /***
     * 顯示新聞數據
     * @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);
    }

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

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

public class Presenter {

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

public Presenter(ViewLogic viewLogic) {
    mViewLogic = viewLogic;
    mNewsLogic = new NewsLogic();
}
//功能只有獲取數據
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(獲取新聞信息失敗);
        }
    });
}

}```

下半場

其實也可以通過一個不太恰當的例子來闡述什么是MVP,我們可以把View看作現流行的網紅女主播,在MVC的時代,咱們的主播除了展示自己美好的身材以外,還需要不斷的說“喜歡主播的寶寶可以點亮,送的禮物越多主播的浮力越大哦”(此看作邏輯處理),這樣就會造成咱們的女主播一邊喊一邊應付浮力多辛苦,但是在MVP的時代,以上邏輯交給了中間人Presenter,也就是場館在不斷的發彈幕處理之前需要主播處理的業務邏輯,而咱們的女主播呢,就可以專心的表演了僅僅充當加載視圖的功能。如果大家不相信,可以下載個直播軟件試試哈(我是不是暴露了什么哈哈哈。。。),這個例子不知道準不準確,但是以我初學者的眼神大差不差。今天的筆記就寫到這里了,不知道是否說得明白,大家也在github上下載我的demo來看看。我的github地址


運行效果:
效果
如果你覺得本文有所錯漏,麻煩留言指出,交流學習共同進步。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,488評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,034評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,327評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,554評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,337評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,883評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,114評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,625評論 1 332
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,555評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,737評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,973評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,615評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,343評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,699評論 2 370

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,589評論 25 707
  • Android App的設計架構:MVC,MVP,MVVM與架構經驗談1. 架構設計的目的1.1 通過設計使程序模...
    天空在微笑閱讀 4,158評論 1 20
  • 我身邊的很多事情都是世俗的 我不停希望 祈求它可以有一個不落俗套意外的結局 水落石出的都世俗了 沒有結果的我繼續祈求著啊
    雀杏閱讀 211評論 0 0
  • 她,就一個人靜靜地坐在角落里,一聲也不吭。這會球場上有多場比賽,時而會出現精彩的好球,別人都在鼓掌叫好,她依舊面無...
    找伴運動閱讀 321評論 0 1