微信号:gh_a58345f58216

介绍:Android高手进阶之路,让我们共同学习,每天进步一点点.http://wuxiaolong.me/

Android MVP 实例

2016-03-06 20:19 吴小龙同學

简单的请求天气功能,演示Android MVP是如何使用的


效果预览



准备

MVP流程


说明:

步骤1:UI实现View方法,引用Presenter

步骤2:Presenter调用Model,走Model具体逻辑

步骤3:Model逻辑实现,回调Presenter方法

步骤4:Presenter回调View,即回到UI,回调View方法


gradle文件


compile 'com.loopj.android:android-async-http:1.4.9'

说明:请求网络使用async-http


目录结构



MVP之V

MainView.java

/**

 * Created by WuXiaolong on 2015/9/23.

 * 处理业务需要哪些方法

 */

public interface MainView {

    void showData(MainModelBean mainModelBean);


    void showProgress();


    void hideProgress();

}


MainActivity

/**

 * Created by WuXiaolong on 2015/9/23.

 * 由Activity/Fragment实现View里方法,包含一个Presenter的引用

 */

public class MainActivity extends AppCompatActivity implements MainView {

    private ProgressBar mProgressBar;

    private TextView text;

    private 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(this);

        //制造延迟效果

        new Handler().postDelayed(new Runnable() {

            @Override

            public void run() {

                mMainPresenter.loadData();

            }

        }, 2000);


    }


    @Override

    protected void onDestroy() {

        mMainPresenter.detachView();

        super.onDestroy();

    }


    @Override

    public void showData(MainModelBean mainModelBean) {

        String showData = getResources().getString(R.string.city) + mainModelBean.getCity()

                + getResources().getString(R.string.wd) + mainModelBean.getWd()

                + getResources().getString(R.string.ws) + mainModelBean.getWs()

                + getResources().getString(R.string.time) + mainModelBean.getTime();

        text.setText(showData);

    }



    @Override

    public void showProgress() {

        mProgressBar.setVisibility(View.VISIBLE);

    }


    @Override

    public void hideProgress() {

        mProgressBar.setVisibility(View.GONE);

    }



}


MVP之P

MainPresenter.java

/**

 * Created by WuXiaolong on 2015/9/23.

 * View和Model的桥梁,它从Model层检索数据后,返回给View层

 */

public class MainPresenter implements Presenter<MainView>, IMainPresenter {

    private MainView mMainView;

    private MainModel mMainModel;


    public MainPresenter(MainView view) {

        attachView(view);

        mMainModel = new MainModel(this);

    }


    @Override

    public void attachView(MainView view) {

        this.mMainView = view;

    }


    @Override

    public void detachView() {

        this.mMainView = null;

    }


    public void loadData() {

        mMainView.showProgress();

        mMainModel.loadData();

    }



    @Override

    public void loadDataSuccess(MainModelBean mainModelBean) {

        mMainView.showData(mainModelBean);

        mMainView.hideProgress();

    }


    @Override

    public void loadDataFailure() {

        mMainView.hideProgress();

    }

}


Presenter

public interface Presenter<V> {


    void attachView(V view);


    void detachView();


}


IMainPresenter

/**

 * Created by WuXiaolong on 2015/9/23.

 * 此接口作用是连接Model

 */

public interface IMainPresenter {

    void loadDataSuccess(MainModelBean mainModelBean);


    void loadDataFailure();

}


MVP之M

MainModel

/**

 * Created by WuXiaolong on 2015/9/23.

 * 业务具体处理,包括负责存储、检索、操纵数据等

 */

public class MainModel {

    IMainPresenter mIMainPresenter;


    public MainModel(IMainPresenter iMainPresenter) {

        this.mIMainPresenter = iMainPresenter;

    }


    public void loadData() {

        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 {

                    MainModelBean mainModelBean = new MainModelBean();

                    JSONObject weatherinfo = response.getJSONObject("weatherinfo");

                    mainModelBean.setCity(weatherinfo.getString("city"));

                    mainModelBean.setWd(weatherinfo.getString("WD"));

                    mainModelBean.setWs(weatherinfo.getString("WS"));

                    mainModelBean.setTime(weatherinfo.getString("time"));

                    mIMainPresenter.loadDataSuccess(mainModelBean);

                } catch (JSONException e) {

                    e.printStackTrace();

                }


            }


            @Override

            public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {

                super.onFailure(statusCode, headers, throwable, errorResponse);

                mIMainPresenter.loadDataFailure();

            }

        });

    }



}


MainModelBean

public class MainModelBean {

    private String city;

    private String wd;

    private String ws;

    private String time;

    //此处省略get和set方法    

}


源码地址

https://github.com/WuXiaolong/AndroidMVPSample


总结

MVC模式

视图(View):用户界面。

控制器(Controller):业务逻辑

模型(Model):数据保存

View 传送指令到 Controller

Controller 完成业务逻辑后,要求 Model 改变状态

Model 将新的数据发送到 View,用户得到反馈


MVP模式

使用MVP时,Activity和Fragment变成了MVC模式中View层,Presenter相当于MVC模式中Controller层,处理业务逻辑。每一个Activity都有一个相应的presenter来处理数据进而获取model。


MVVM模式

将 Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致。唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。


要想了解更多,请点击底部「阅读原文」跳转至我的博客。


随手点赞和转发是一种态度。




微信公众号:AndroidProgrammer


长按二维码一键关注


 
AndroidProgrammer 更多文章 吴小龙同學 Android开发人员调查 Android Toolbar 原来这个是你做的啊 手把手教你建github技术博客by hexo
猜您喜欢 机遇与挑战并存:Haven2.0引领大数据云时代变革 你知道吗?原来验证码是为了对抗黑客! 视频对话:一个为留长发做了程序员的法学毕业生 性能测试测试环境建模-清晨每日分享-吴老电台 【讲座】成都理工,我们来啦!