1、MVP模式的事件调用和响应的时间线
(1)View
- 持有Presenter对象的引用,监听UI事件,根据用户操作产生的数据调用Presenter的数据检验方法。
- 定义了一组UI刷新方法由Presenter来调用。
(2)Presenter
- 持有Model对象的引用,定义了一组检验数据的方法,调用Model的方法访问数据
- 持有View对象的引用,根据数据检验结果调用View响应的UI操作方法。
(3)Model
- 持有对数据源访问对象,对数据源进行访问
2、项目中MVP结构的应用方法
(1)建立Contract接口,其中包含以下两个内部接口
- View接口,定义了一组刷新UI的方法
- Presenter接口,定义了一组对数据进行检验的方法
(2)创建Fragment/Activity类,实现Contract内部的View接口
- 持有Contract.Presenter的引用
- 实现对UI事件的监听方法
- 实现View接口中的刷新UI方法
(3)创建Presenter类,实现Contract内部的Presenter接口
- 持有Contract.View的引用
- 实现Presenter中对数据进行检验的方法,在方法内调用View的UI方法
3、项目中MVP结构的应用方法
Contract
public interface MainContract {
interface View{
void flushUi(String msg);
}
interface Presenter{
void checkText(String text);
}
}
View
public class MainActivity extends AppCompatActivity implements MainContract.View{
private EditText input;
private Button go;
private MainContract.Presenter presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
presenter = new MainPresenter(this);
input = findViewById(R.id.input);
go = findViewById(R.id.go);
go.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String text = input.getText().toString();
presenter.checkText(text);
}
});
}
@Override
public void flushUi(String msg) {
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}
}
Presenter
public class MainPresenter implements MainContract.Presenter{
private MainContract.View view;
public MainPresenter(MainContract.View view){
this.view = view;
}
@Override
public void checkText(String text) {
if(text.equals("yes")){
view.flushUi("正确");
}
else if(text.equals("no")){
view.flushUi("错误");
}
else{
view.flushUi("不知道");
}
}
}