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。
此例子引用:http://blog.csdn.net/briblue/article/details/52839242
首先先看看你的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