简易MVPdemo学习MVP框架

由于公司项目需要用到mvp框架,所以最近恶补了一下mvp,找到了一个查询天气的接口,于是自己实现一下完整的mvp,网络请求用的rxjava和retrofit: 相信说起mvp,大部分人都能想到它的交互图

model层获取数据,presenter和view相互交互 控制数据展示在view上,首先看view的接口:


public interface MainMvpView {
    void showWeatherInfo(String info);
    void showErrorInfo(String error);
    void showRxJavaWeatherInfo(String info);
}
复制代码

就是3个方法,第一个是普通网络请求展示一条天气信息,第二个是展示错误信息,第三个是通过rxjava异步请求一次性展示所有天气信息。然后activity实现MainMvpView接口:

public class MainActivity extends AppCompatActivity implements MainMvpView {

    private TextView mTvResult;
    private MainMvpPresent mMainMvpPresent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTvResult = (TextView) findViewById(R.id.tv_result);

        mMainMvpPresent = new MainPresentImpl<>(this);
    }

    @Override
    public void showWeatherInfo(String info) {
        mTvResult.setText(info);
    }

    @Override
    public void showErrorInfo(String error) {
        Toast.makeText(this, error, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void showRxJavaWeatherInfo(String info) {
        mTvResult.setText(mTvResult.getText() + info);
    }

    public void beijing(View view) {
        mMainMvpPresent.getWeatherInfo("beijing");
    }

    public void shanghai(View view) {
        mMainMvpPresent.getWeatherInfo("shanghai");
    }

    public void shenzhen(View view) {
        mMainMvpPresent.getWeatherInfo("shenzhen");
    }

    public void rxAll(View view) {
        mMainMvpPresent.getRxJavaWeatherInfo(new String[]{"beijing","shanghai","shenzhen"});
    }
}
复制代码

presenter在activity中new出来,来看下presenter层接口:

public interface MainMvpPresent<V extends MainMvpView> {
    void getWeatherInfo(String city);
    void getRxJavaWeatherInfo(String[] citys);
}
复制代码

只有2个方法,就是普通获取一个城市信息,另外一个是通过rxjava异步获取所有城市信息,看下presenter的实现类:


public class MainPresentImpl<V extends MainMvpView> implements MainMvpPresent {
    private MainMvpView mMainMvpView;
    private MainMvpData mMainMvpData;

    public MainPresentImpl(MainMvpView view) {
        mMainMvpView = view;
        mMainMvpData = new MainDataImpl();
    }

    @Override
    public void getWeatherInfo(String city) {
        mMainMvpData.getWeatherInfo(city, new MainMvpData.WeatherInfoCallBack() {
            @Override
            public void onLoadSuccess(WeatherData weatherData) {
                mMainMvpView.showWeatherInfo(weatherData.toString());
            }

            @Override
            public void onLoadFailed(String error) {
                mMainMvpView.showErrorInfo(error);
            }
        });
    }

    @Override
    public void getRxJavaWeatherInfo(String[] citys) {
        mMainMvpData.getRxJavaWeatherInfo(citys, new MainMvpData.WeatherInfoCallBack() {
            @Override
            public void onLoadSuccess(WeatherData weatherData) {
                mMainMvpView.showRxJavaWeatherInfo(weatherData.toString());
            }

            @Override
            public void onLoadFailed(String error) {
                mMainMvpView.showErrorInfo(error);
            }
        });
    }
}

复制代码

MainPresentImpl的构造参数需要传入view,把数据层MainDataImpl new 出来,然后实现MainMvpPresenter,在对应的方法里面获取数据传递给view。 最后看数据层接口:

public interface MainMvpData {
    void getWeatherInfo(String city,WeatherInfoCallBack callBack);

    void getRxJavaWeatherInfo(String[] citys,WeatherInfoCallBack callBack);

    interface WeatherInfoCallBack{
        void onLoadSuccess(WeatherData weatherData);
        void onLoadFailed(String error);
    }
}
复制代码

分别是获取天气数据,和网络请求的回调,然后用数据层的实现类实现这个接口进行网络请求并处理回调就可以了,最后看下效果图:

写完这个demo,算是对mvp有了一个整体上的认识吧,对复杂项目的拓展来说,mvp算是比较有优势的,希望能帮到你,完整demo上传github: https://github.com/mylovehang/mvpDemo。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值