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