Android MVP+RxJava+Retrofit 入门封装
2017-12-14 19:45
501 查看
为什么要在Android开发中使用MVP
个人理解是这样的,并不是mvc模式不好,做过javaweb开发的小伙伴都知道mvc也是为了更好的解耦,但是因为在android开发中,有Activity这样的组件以及Fragment这样的碎片会导致Activity中的代码太臃肿,因为Activity中既要写逻辑(C层)也要写数据获取(M层),所以在一个类中C层和M层的代码都在一起了如何能够快速掌握MVP设计模式
网上写MVP 的例子太多了 但是更推荐的是google官方的 todo-mvp 这个例子,然后就是要自己总结和理解
1.MVP的目的? 更好的解耦 让Activity变成View层(Activity中只有View初始化和变化的逻辑)
2.Presenter的作用? 拥有View层和Module的实例 (View层无法直接访问Module层)
3.Module层的写法? 利用接口将自己封装的网络请求框架请求成功后的数据进行返回
下面纯是一个小例子,通过Retrofit网络请求Gank接口 并解析显示在textview上,例子虽小,但是五脏俱全,首先看一下结构
开始例子
[b]1.导入需要的依赖以及在清单文件添加网络权限:[/b]
//rxjava compile 'io.reactivex.rxjava2:rxjava:2.0.1' compile 'io.reactivex.rxjava2:rxandroid:2.0.1' //retrofit compile 'com.squareup.retrofit2:retrofit:2.2.0' //retrofit支持Gson compile 'com.squareup.retrofit2:converter-gson:2.2.0' //retrofit支持rx依赖 compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'2.完成RetrofitApi请求类public interface Api {
@GET("data/Android/10/1")
Observable<GankBean> getGankBean();
}
3.封装一个Retrofit的网络请求封装类public class RetrofitTool {
public static RetrofitTool instance;
private Retrofit retrofit;
private final Api api;
public Api getApi() {
return api;
}
private RetrofitTool() {
//初始化Retrofit
retrofit = new Retrofit.Builder().baseUrl("http://gank.io/api/")
//给Retrofit添加Gson解析功能
.addConverterFactory(GsonConverterFactory.create())
//给Retrofit添加Rxjava功能
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
//初始化Retrofit的Api接口
api = retrofit.create(Api.class);
}
//线程锁单例
public static RetrofitTool getInstance() {
if (instance == null) {
synchronized (RetrofitTool.class) {
if (instance == null) {
instance = new RetrofitTool();
}
}
}
return instance;
}
}准备工作完成了,个人认为应该先写Presenter层的接口
4.编写Presenter层的接口public interface MainActivityPresenter {
//这是留给View层去调用Module层请求的方法
void getGankBean();
//下面四个方法是P层对Module层请求状态的监听(请求成功,开始请求,请求结束,请求失败)
void getGankBeansuccess(GankBean gankBean);
void getGankBeanStart();
void getGankBeanFailed();
void getGankBeanFinish();
}5.先不创建Presenter的实现类 接着创建Module层的接口public interface GankBeanModule {
//把P层的接口作为方
4000
法参数传递进来(为了进度监听) 这个方法顾名思义就是请求GankBean数据
void getGankBean(MainActivityPresenter presenter);
}6.创建Module层的实现类(在实现类使用Retrofit进行网络请求同时利用刚刚传进来Presenter进行状态监听)public class GankBeanModuleImpl implements GankBeanModule {
@Override
public void getGankBean(final MainActivityPresenter presenter) {
//开始请求
presenter.getGankBeanStart();
//Retrofit开始请求
RetrofitTool.getInstance().getApi()
.getGankBean()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<GankBean>() {
@Override
public void accept(GankBean gankBean) throws Exception {
//请求成功并调用P层的监听方法
presenter.getGankBeansuccess(gankBean);
presenter.getGankBeanFinish();
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
//请求失败的监听调用
presenter.getGankBeanFailed();
throwable.printStackTrace();
}
});
}
}7.对View层的接口进行编写
也比较好理解,声明了四种状态,在网络请求的时候在不同的状态中显示不同的ui效果,最好在成功的方法中把实体类作为参数传递public interface MainActivityView {
void success(GankBean gankBean);
void onStartGetData();
void onFailedGetData();
void onFinishGetData();
}8.对Presenter的实现类进行编写public class MainActivityPresenterImpl implements MainActivityPresenter {
private MainActivityView view;
private GankBeanModule gankBeanModule;
public MainActivityPresenterImpl(MainActivityView view) {
//在构造方法中初始化View层和Module层的对象
this.view = view;
gankBeanModule = new GankBeanModuleImpl();
}
@Override
public void getGankBean() {
gankBeanModule.getGankBean(this);
}
//module层请求的回调并调用View层相对应状态的方法
@Override
public void getGankBeansuccess(GankBean gankBean) {
view.success(gankBean);
}
@Override
public void getGankBeanStart() {
view.onStartGetData();
}
@Override
public void getGankBeanFailed() {
view.onFailedGetData();
}
@Override
public void getGankBeanFinish() {
view.onFinishGetData();
}
}
9.在Activity(View的实现类)中编写public class MainActivity extends AppCompatActivity implements MainActivityView {
public TextView tv1;
public MainActivityPresenterImpl presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv1 = (TextView) findViewById(R.id.tv1);
//获取P层实例并把view层传给P层
presenter = new MainActivityPresenterImpl(this);
//调用P层请求方法
presenter.getGankBean();
}
@Override
public void success(GankBean gankBean) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i <gankBean.getResults().size() ; i++) {
sb.append(gankBean.getResults().get(i).getUrl() + "\n");
}
tv1.setText(sb);
}
@Override
public void onStartGetData() {
tv1.setText("正在加载");
}
@Override
public void onFailedGetData() {
tv1.setText("加载失败");
}
@Override
public void onFinishGetData() {
Toast.makeText(this, "加载完成", Toast.LENGTH_SHORT).show();
}
}
兜兜转转一大圈之后,module层的数据终于通过
1.view层调用p层中的getGankBean()方法
2.在p层中的getGankBean()方法内p层会调用module层的[b]getGankBean()的方法进行网络请求[/b]
[b]3.请求成功后再利用p层在m层的监听方法把数据回调到p层[/b]
[b]4.然后在p层的回调方法中调用view层的监听方法把数据回调到Activity中[/b]
[b]深刻理解之后就更能体会p是桥梁了[/b]
相关文章推荐
- Android -- 带你一点点封装项目 MVP+BaseActivity+Retrofit+Dagger+RxJava(三)
- Android--带你一点点封装项目 MVP+BaseActivity+Retrofit+Dagger+RxJava(一)
- Android MVP+Retrofit(封装)+RxJava实例
- Android RxJava+Retrofit+MVP 入门总结
- Android--带你一点点封装项目 MVP+BaseActivity+Retrofit+Dagger+RxJava(二)
- Android -- 带你一点点封装项目 MVP+BaseActivity+Retrofit+Dagger+RxJava(三)
- Android Retrofit+RxJava+MVP封装
- Android入门学习——RxJava+Retrofit+MVP学习
- Rxjava+Retrofit+MVPdemo封装
- RxAndroid+Retrofit+GreenDao+MVP框架---通用基类封装(二)
- 如何优雅的使用Retrofit、Rxjava、Butterknife、Material开发一款MVP模式的新闻+天气预报+妹子的Android app
- MVP实战心得(三)---封装Retrofit2.0+RxAndroid+RxBus
- Android 教你一步步搭建MVP+Retrofit+RxJava网络请求框架
- Android MVP+Retrofit+RxJava实践小结
- Android详细的登录注册功能MVP+Rxjava2.0+Retrofit2.0相结合的实战篇章
- RxAndroid+Retrofit+GreenDao+MVP框架---通用基类封装(一)
- 关于Android高性能Restful请求的通用封装(单Retrofit和Retrofit+RxJava)
- Rxjava 2.0+Retrofit 2.0 +MvP美好封装
- Android MVP+Retrofit+RxJava实践小结
- Android-MVP-Dagger-Retrofit-Rxjava-Okhttp