MVP架构学习

看到一篇干货,里面是作者给工作一年的开发经验:
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的分离。

猜你喜欢

转载自blog.csdn.net/irony0egoist/article/details/54620024