美文网首页
Rxjava + Retrofit2.0 + MVP

Rxjava + Retrofit2.0 + MVP

作者: 无良安生 | 来源:发表于2018-09-29 15:52 被阅读0次

来来来,我们一起踩坑,一起写BUG
最近看了这个,然后也试着搞了一下,发下有点不想看以前的项目了....

传送:demo-GitHub

MVP这个定义我就不说了,网上很多,可以直接看官网的,需要的请到这里集结--->传送门MVP之GitHub

1、包结构

base --->主要放的是基类
contacts --->常数
contract --->管理MVP对应层的接口
listener --->接口
model --->逻层
presenter --->业务层
retrofit --->关于retrofit的
tool --->工具
ui --->关于界面的
view--->presenter 和ui通讯的接口
weight--->自定义view

2、引用RxJava+Retrofit2.0

1、gradle:

    //RxJava+RxAndroid+RxAndroid
    implementation 'com.squareup.retrofit2:retrofit:2.3.0'
    implementation 'com.squareup.retrofit2:converter-jackson:2.0.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.1.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
    implementation 'io.reactivex.rxjava2:rxjava:2.1.7'
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'

2、接口管理
RetrofitService类

public interface RetrofitService {

    @FormUrlEncoded //表单上传
    @POST("jsonTest.action")
    Observable<String> getMainData(@FieldMap Map<String, String> map);//map形式可以让我们用个类封装要传的参数,便于管理
}

3、Retrofit 整理类
RetrofitManager类

public class RetrofitManager {

    private volatile static RetrofitManager retrofitManager;
    private Retrofit retrofit;

    //无参的单利模式
    public static RetrofitManager getSingleton() {
        if (retrofitManager == null) {
            synchronized (RetrofitManager.class) {
                retrofitManager = new RetrofitManager();
            }
        }
        return retrofitManager;
    }

    //无参的构造方法
    private RetrofitManager() {
        initRetrofitManager();
    }

    //构造方法创建Retrofit实例
    private void initRetrofitManager() {
        retrofit = new Retrofit.Builder().baseUrl(Constacts.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
    }

    //构造方法创建Retrofit实例
    private RetrofitManager buildRetrofit() {
        retrofit = new Retrofit.Builder().baseUrl(Constacts.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();

        return retrofitManager;
    }


    private OkHttpClient getClient() {
        CommonInterceptor commonInterceptor = new CommonInterceptor();
        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(commonInterceptor)
                .build();
        return client;
    }

    public RetrofitService RetrofitService() {
        return retrofit.create(RetrofitService.class);
    }
}

4、其他
<p>这个就是几个核心了,剩下的什么错误管理呀,之类的就请自己看写的demo吧 </p>

3、MVP层详解

model主要是处理数据

1、model 逻辑层

这个层的类只负责拿到数据 不用去管数据是做什么,只管拿到对应的就好了

MainModel 类

public class MainModel implements MainContract.Model {

    @Override
    public void getMainData(Map<String, String> map, Presenter.RxObserver observer) {
        RetrofitManager
                .getSingleton()
                .RetrofitService()
                .getMainData(map)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(observer);
    }
}

2、presenter 业务层

这个是连接model和view的中间层,他不涉及界面操作 通过接口提醒view层刷新就行

1.基类

public abstract class Presenter<V> {
    public V view;//这个是通知view刷新的接口可以没有
    private IHttp http;//这个是网络请求需要的接口(都一样,直接这样写了)

    void Presenter(){

    }
    /**
     * 加载View 建立连接
     */
    public void addView(V v, IHttp http) {
        this.view = v;
        this.http = http;

    }

    /**
     * 断开连接
     */
    public void detattch() {
        if (view != null) {
            view = null;
        }
    }

    /**
     *
     * @param <Object>
     */
    public class RxObserver<Object> implements Observer<Object> {

        @Override
        public void onSubscribe(Disposable d) {

        }

        @Override
        public void onNext(Object object) {
            http.onSuccess(object);
        }

        @Override
        public void onError(Throwable e) {
            http.onFail(e);
        }

        @Override
        public void onComplete() {
            http.onCompleted();
        }
    }
}

2.对应界面的presenter
MainPresenter 类

public class MainPresenter extends Presenter<IMainView> implements MainContract.Presenter {
    private MainModel mainModel;

    void MainPresenter() {
        mainModel = new MainModel();
    }

    @Override
    public void getMainData(Map<String, String> map) {
        mainModel.getMainData(map,new RxObserver());
    }
}

3、View 界面

1.基类
这里只贴activity的fragment自己去demo看了

public abstract class MVPActivity<p extends Presenter> extends AppCompatActivity implements IMVPView , IHttp {
    private Unbinder unbinder;
    public p presenter;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initBefor();
        setContentView(initLayout());
        unbinder = ButterKnife.bind(this);
        initView();
        initData();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (unbinder != null) {//解绑
            unbinder.unbind();
        }
        presenter.detattch();
    }
    public abstract void initView();
    public abstract void initData();
    public abstract int initLayout();
    protected abstract p initPresener();

    @Override
    public void initBefor() {
        presenter = initPresener();
        presenter.addView(this,this);
    }
    @Override
    public void onSuccess(Object object) {  }
    @Override
    public void onFail(Object t) { }
    @Override
    public void onCompleted() { }
}

2.view层 MainActivity类

public class MainActivity extends MVPActivity<MainPresenter> {

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

    @Override
    public void initView() {

    }

    @Override
    public void initData() {
         presenter.getMainData(Tool.toMap(new MainInfo()));
    }

    @Override
    public int initLayout() {
        return 0;
    }

    @Override
    protected MainPresenter initPresener() {
        return new MainPresenter();
    }

    @Override
    public void onSuccess(Object object) {
        super.onSuccess(object);
        //请求成功
    }
    //失败呀,完成呀自己看IHttp这个接口吧
}

3.View层的接口:

public interface IMVPView {
    /**
     * 在加载界面之前
     */
    void initBefor();

    /**
     * 初始化UI
     */
    void initView();

    /**
     * 加载数据
     */
    void initData();

    /**
     * 加载布局
     * @return 布局id
     */
    int initLayout();
}

4、大结局

总体写的不怎么 希望能帮助大家,最后再来次传送:demo-GitHub
不经经常写,感觉写这么多,才感觉人家写的辛苦,所以以后给那些大神点个攒,哈哈 顺便给我这个小白点鼓励呗哈哈

相关文章

网友评论

      本文标题:Rxjava + Retrofit2.0 + MVP

      本文链接:https://www.haomeiwen.com/subject/mnfboftx.html