Android MVP簡單敘述

V:大哥,那個程序員想讓我顯示對話框咋整啊?
P:沒事,我有你的接口對象,實現了方法,你拿去用就是。
V:那我里面的數據咋整????
P:沒事,我還有M的接口對象,實現了數據方法,你用就沒事。
V:好嘞
M:呵呵 (??_?)哦

M:
model, 是APP中數據處理和業務邏輯部分。 :負責存儲、檢索、操縱數據(有時也實現一個Model interface用來降低耦合);
V:
View, 一般是Activity或者Frament,view中一半都會包括prensenter的引用。負責繪制UI元素、與用戶進行交互(在Android中體現為Activity);
P:
Presenter, 他處于view和model中間 從model獲取數據,然后返回給view,以及界面的交互,作為View與Model交互的中間紐帶,處理與用戶交互的負責邏輯。

用戶的請求首先會到達View,View傳遞請求到特定的Presenter,Presenter從Model獲取數據后,再把處理結果通過接口傳遞到View。

Paste_Image.png
此例子引用:http://blog.csdn.net/briblue/article/details/52839242
Paste_Image.png

首先先看看你的V

public interface IWetherView {
    /**
     * 顯示天氣信息
     *
     * @param info
     */
    void onInfoUpdate(String info);

    /**
     * 顯示獲取信息等待對話框
     */
    void showWaitingDialog();

    /**
     * 取消顯示對話框
     */
    void dissmissWaitingDialog();
}

然后你對應的V實現層 這里直接用MainActivity代替
部分來看。首先實現接口

public class MainActivity extends AppCompatActivity implements IWetherView {
    @Override
    public void onInfoUpdate(final String info) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                textView.setText(info);
            }
        });
    }

    @Override
    public void showWaitingDialog() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (mDialog != null && mDialog.isShowing()) {
                    mDialog.dismiss();
                }
                mDialog = ProgressDialog.show(MainActivity.this, "", "正在獲取中");
            }
        });
    }

    @Override
    public void dissmissWaitingDialog() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (mDialog != null && mDialog.isShowing()) {
                    mDialog.dismiss();
                }
            }
        });
    }
}

我這里直接實現代碼邏輯

詳解說明: 
顯示天氣信息無非就是更改你的textview 
onInfoUpdate()
顯示對話框也很簡單
showWaitingDialog()
然后是取消對話框
dissmissWaitingDialog

這樣你V層的操作就OK了。V可是說是很輕松的一層,拿到數據,然后顯示。M也是一樣。別人給你數據,你存起來,用M的時候new一個。
所以M層數據可以為 提供數據和儲蓄數據

public interface IWetherModel {

    /**
     * 提供數據
     *
     * @return
     */
     String getInfo();

    /**
     * 儲存數據
     *
     * @param info
     */
     void setInfo(String info);
}

對應的實現類

public class IWetherImpl implements IWetherModel {

    private String info;

    @Override
    public String getInfo() {
        Random random = new Random();
        int seed = random.nextInt(3);
        if (seed % 2 == 0) {
            return info;
        } else {
            return info + info;
        }
    }

    @Override
    public void setInfo(String info) {
        this.info = info;
    }
}

因為我這里模擬了網絡獲取數據然后在顯示,所以定義了string info 相信你一看就會明白 每次點擊最后都會到這里來獲取數據,通過隨機數來給不同的天氣。真實項目中并不會這樣,就是json解析的Bean而已。get set方法的調用

接下來就是重頭戲P層。因為你的P要和V M通信。所以你要持有他們的接口對象

    /**
     * 因為要和view以及modle雙向對接 所以要持有接口調用
     */
    private IWetherModel mModel;
    private IWetherView mView;

    public WetherPresenter(IWetherView mView) {
        this.mView = mView;
        mModel = new IWetherImpl();
    }

P層是直接來操作V和M的,所以要有對應的方法。所以可以得出

/**
     * P層顯示對話框
     */
    private void showWaitingDialog() {
        if (mView != null) {
            mView.showWaitingDialog();
        }
    }

    /**
     * P層取消對話框
     */
    private void dissmissWaitingDialog() {
        if (mView != null) {
            mView.dissmissWaitingDialog();
        }
    }

    /**
     * P層 更新天氣信息
     *
     * @param Info
     */
    private void updateWetherInfo(String Info) {
        if (mView != null) {
            mView.onInfoUpdate(Info);
        }
    }

    /**
     * P層操作M層 保存信息
     *
     * @param info
     */
    private void saveInfo(String info) {
        mModel.setInfo(info);
    }

    /**
     * P層操作M層 獲取信息
     *
     * @return
     */
    private String LocaIngo() {
        return mModel.getInfo();
    }

可以看到 每個方法的最終都是通過對象進而調用到了實際的V M ,P層的方法是為了給外部需要用P層的一個接口。自己使用也是方便。
然后寫一個給V更新數據的一個方法,這個方法無非就是把你寫的方法都集合到一起而已。

    /**
     * P層 模擬網絡請求數據
     *
     * @return
     */
    public void getNetworkInfo() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //打開等待會話框
                    showWaitingDialog();
                    //模擬網絡請求,延時1秒
                    Thread.sleep(1*1000);
                    //模擬信息
                    String Info = "21度,晴轉多云";
                    //調用P層方法來進而調用M層信息
                    saveInfo(Info);
                    //此為模擬數據,真實數據應該為網絡請求返回值
                    String LocaInfo = LocaIngo();
                    //更新天氣信息
                    updateWetherInfo(LocaInfo);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    //取消對話框
                    dissmissWaitingDialog();
                }
            }
        }).start();
    }

最后 在你的V去調用你的這個集合了所有方法的方法,

                mWetherPresenter.RequestWetherInfo();

完成。 我在代碼中寫了注釋,相信照著寫一次,然理解理解就可以,或者看看原作者的博客,代碼會打包給你們,
https://github.com/XiaMuYaoDQX/MVP.git
有什么不懂的歡迎一起討論 QQ交流群有什么不懂的大家一起討論:5700145986

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容