看到一篇干货,里面是作者给工作一年的开发经验:
http://www.codeceo.com/article/android-dev-experience.html
里面讲到的第四点“从 MVC 到 MVP”,看作者开源项目之前先来学习MVP
学习MVP的干货资料:
http://www.jianshu.com/p/9a6845b26856
http://www.jianshu.com/p/ed2aa9546c2c
参照网上的mvp写的demo:
https://github.com/irony0egoist/MVPDemo
1.调用网络接口获取天气
2.简单登陆界面
3.listview
4.SpareArray存储数据
分析网络接口获取天气
Model层:
Model层负责网络获取数据
public interface IWeatherModel {
void loadWeather(String cityNum,OnWeatherListener onWeatherListener);
}
实现类:
通过封装的Volley请求向接口请求数据,并通过OnWeatherListener回调
public class WeatherModel implements IWeatherModel {
@Override
public void loadWeather(String cityNum, final OnWeatherListener listener) {
VolleyRequest.newInstance()
.newGsonRequest("http://www.weather.com.cn/data/sk/" + cityNum + ".html", Weather.class, new Response.Listener< Weather>(){
@Override
public void onResponse(Weather weather) {
listener.onSuccess(weather);
}
},new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError volleyError) {
listener.onError();
}
});
}
}
天气数据获取的回调接口,将数据从Model层回调到Presenter层(p层负责将信息加载到Activity上,即View层上)
public interface OnWeatherListener {
void onSuccess(Weather weather);
void onError();
}
Presenter层:
获取model数据,更改UI
public interface IWeatherPresenter {
void getWeather(String cityNum);
}
Presenter:作为View与Model交互的中间纽带,显示天气信息
public class WeatherPresenter implements IWeatherPresenter ,OnWeatherListener{
private IWeatherView view;
private IWeatherModel model;
public WeatherPresenter(IWeatherView view) {
this.view = view;
model=new WeatherModel();
}
@Override
public void getWeather(String cityNum) {
if (view!=null){
view.showLoading();
model.loadWeather(cityNum,this);
}
}
@Override
public void onError() {
if (view!=null){
view.hideLoading();
view.showError();
}
}
@Override
public void onSuccess(Weather weather) {
if (view!=null){
view.hideLoading();
view.setWeatherInfo(weather);
}
}
}
View层:
public interface IWeatherView {
void showLoading();
void hideLoading();
void showError();
void setWeatherInfo(Weather weather);
}
View实现类:
将Activity作为View层,通过Presenter层对控件的各种动作进行控制,达到分离的目的
public class WeatherActivity extends AppCompatActivity implements IWeatherView,View.OnClickListener{
private Dialog loadingDialog;
private EditText cityNOInput;
private TextView city;
private TextView cityNO;
private TextView temp;
private TextView wd;
private TextView ws;
private TextView sd;
private TextView wse;
private TextView time;
private TextView njd;
private Button go;
private IWeatherPresenter weatherPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_weather);
VolleyRequest.buildRequestQueue(this);
init();
}
private void init() {
cityNOInput = (EditText) findViewById(R.id.et_city_no);
city = (TextView) findViewById(R.id.tv_city);
cityNO = (TextView) findViewById(R.id.tv_city_no);
temp = (TextView) findViewById(R.id.tv_temp);
wd =(TextView) findViewById(R.id.tv_WD);
ws = (TextView)findViewById(R.id.tv_WS);
sd = (TextView)findViewById(R.id.tv_SD);
wse = (TextView)findViewById(R.id.tv_WSE);
time =(TextView) findViewById(R.id.tv_time);
njd = (TextView)findViewById(R.id.tv_njd);
go= (Button) findViewById(R.id.btn_go);
go.setOnClickListener(this);
weatherPresenter = new WeatherPresenter(this);
loadingDialog = new ProgressDialog(this);
loadingDialog.setTitle("加载天气中...");
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_go:
weatherPresenter.getWeather(cityNOInput.getText().toString().trim());
break;
}
}
@Override
public void hideLoading() {
loadingDialog.hide();
}
@Override
public void showLoading() {
loadingDialog.show();
}
@Override
public void showError() {
Toast.makeText(getApplicationContext(), "error", Toast.LENGTH_SHORT).show();
}
@Override
public void setWeatherInfo(Weather weather) {
WeatherInfo info = weather.getWeatherinfo();
city.setText(info.getCity());
cityNO.setText(info.getCityid());
temp.setText(info.getTemp());
wd.setText(info.getWD());
ws.setText(info.getWS());
sd.setText(info.getSD());
wse.setText(info.getWS());
time.setText(info.getTemp());
njd.setText(info.getNjd());
}
}
总结:Model处理各种后台任务和网络请求等,Presenter层对Model获取到的数据加载到VIew层,View层提供一系列UI操作让Presenter层来控制,从而实现VIew和Model的分离。