由于公司项目需要用到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。