Android MVP 实例

来源:互联网 发布:python 2.7 re.compile 编辑:程序博客网 时间:2024/04/27 14:26

前段时间Google在Github推出了一个项目,专门展示Android引用各种各样的MVP架构,算是官方教程了。趁着还新鲜,让我们来抛砖引玉一探究竟,看看在Google眼里什么样算是好的MVP架构。

Android官方MVP架构示例项目解析
作者 吕英斌 发布于 2016年4月29日 | 被首富的“一个亿”刷屏?不如定个小目标,先把握住QCon上海的优惠吧! 2 讨论

分享到:微博微信FacebookTwitter有道云笔记邮件分享"稍后阅读""我的阅读清单"前段时间Google在Github推出了一个项目,专门展示Android引用各种各样的MVP架构,算是官方教程了。趁着还新鲜,让我们来抛砖引玉一探究竟,看看在Google眼里什么样算是好的MVP架构。

App架构在Android开发者中一直是讨论比较多的一个话题,目前讨论较多的有MVP、MVVM、Clean这三种。google官方对于架构的态度一直是非常开放的,让开发者自主选择组织和架构app的方式,期望能留给开发者更多的灵活性。

由于没有一套权威的架构实现,现在很多App项目中在架构方面都有或多或少的问题。第一种常见问题是没有架构,需求中的一个页面对应项目中的一个activity或一个fragment,所有的界面响应代码、业务逻辑代码、数据请求代码等等都集中在其中。第二种常见的问题是架构实现的不断变化,不断在各种架构间摇摆,一直找不到一个适合自己的架构。
下面我们来说说MVP吧
这里写图片描述
一个关于天气的小例子
架构分包如下
这里写图片描述
说明:请求网络使用async-http
MainActivity.java

public class MainActivity extends AppCompatActivity implements MainView {    ProgressBar mProgressBar;    TextView text;    MainPresenter mMainPresenter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();    }    private void initView() {        text = (TextView) findViewById(R.id.text);        mProgressBar = (ProgressBar) findViewById(R.id.mProgressBar);        mMainPresenter = new MainPresenter();        mMainPresenter.attachView(this);        mMainPresenter.loadData();    }    @Override    protected void onDestroy() {        mMainPresenter.detachView();        super.onDestroy();    }    @Override    public void showData(MainModel mainModel) {        text.setText("城市:" + mainModel.getCity()                + "\n风向:" + mainModel.getWd()                + "\n风级:" + mainModel.getWs()                + "\n发布时间:" + mainModel.getTime());    }    @Override    public void showProgress() {        mProgressBar.setVisibility(View.VISIBLE);    }    @Override    public void hideProgress() {        mProgressBar.setVisibility(View.GONE);    }}

基础建筑
MVP之M,
这个除了一下getter和setter之外不能有什么东西了,切记,这儿和MVC其实是差不多的

MainModel.java

public class MainModel {    String city;    String wd;    String ws;    String time;    public String getCity() {        return city;    }    public void setCity(String city) {        this.city = city;    }    public String getWd() {        return wd;    }    public void setWd(String wd) {        this.wd = wd;    }    public String getWs() {        return ws;    }    public void setWs(String ws) {        this.ws = ws;    }    public String getTime() {        return time;    }    public void setTime(String time) {        this.time = time;    }}

核心重点
MVP之P

MainPresenter.java

//业务具体处理public class MainPresenter implements Presenter<MainView> {    private MainView mMainView;    @Override    public void attachView(MainView view) {        this.mMainView = view;    }    public void loadData() {        mMainView.showProgress();        AsyncHttpClient asyncHttpClient = new AsyncHttpClient();        asyncHttpClient.get("http://www.weather.com.cn/adat/sk/101010100.html", new JsonHttpResponseHandler() {            @Override            public void onSuccess(int statusCode, Header[] headers, JSONObject response) {                super.onSuccess(statusCode, headers, response);                try {                    MainModel mainModel = new MainModel();                    JSONObject weatherinfo = response.getJSONObject("weatherinfo");                    mainModel.setCity(weatherinfo.getString("city"));                    mainModel.setWd(weatherinfo.getString("WD"));                    mainModel.setWs(weatherinfo.getString("WS"));                    mainModel.setTime(weatherinfo.getString("time"));                    mMainView.showData(mainModel);                    mMainView.hideProgress();                } catch (JSONException e) {                    e.printStackTrace();                }            }            @Override            public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {                super.onFailure(statusCode, headers, throwable, errorResponse);                mMainView.hideProgress();            }        });    }    @Override    public void detachView() {        this.mMainView = null;    }}
Presenterpublic interface Presenter<V> {    void attachView(V view);    void detachView();}

可见之基

MVP之V

MainView.java

//处理业务需要哪些方法public interface MainView {    void showData(MainModel mainModel);    void showProgress();    void hideProgress();}

PS

使用mvp时,Activity和Fragment变成了view层的一部分而把绝大多数工作代理给了presenter。每一个Activity都有一个相应的presenter来处理数据进而获取model。

2 0