基于mvp架构的retrofit+rxandroid的网络访问

1.如果大家还不是很了解retrofit+rxandroid的话,建议去github去看一下获取搜一下关于这方面的资料,废话不多说我们来开始了解一下基于mvp的retrofit的使用


2.首先看一下整体的结构图

3.由图可以看出这种写法完全摒弃了view,model和presenter层的复杂性,分别有一个工厂类来代替了,大家也可以根据自己的需求来修改,那么问题来,我们如何调用和使用呢,废话不多说,直接上代码:

1,看mode层到底干了一些什么:

public class ModeFactory {
    public static ModeFactory business;
    public static ModeFactory getInstance(){
        if (business == null) {
            business = new ModeFactory();
        }
        return business;
    }


    public  void radioModel(CallBackListener<List<RadiosListEntity>> backListener) {
        RetrofitHelper.getInstance().getService().getRadiosList()
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(NetWorkDao.getInstance().createSubscriber(backListener));
    }


    public void songModel(String mode,CallBackListener<List<SongsListEntity>> backListener) {
        RetrofitHelper.getInstance().getService().getSongsList(mode)
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(NetWorkDao.getInstance().createSubscriber(backListener));
    }

    public void radioListModel(Object o,CallBackListener<PlayRadioListEntity> backListener) {
        RetrofitHelper.getInstance().getService().reqRadiosList((PlayRadioReq) o)
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(NetWorkDao.getInstance().createSubscriber(backListener));
    }




}

是不是少些了很多model接口和实现类,直接写一个modelfactory,然后用单例的方式获取,然后在presenter中调用,然后在subscibe中传入一个你创建的订阅者,同过订阅者把回调的接口传入,这样就完成了一个model体的实现。同时也把需要的传入的参数传入进来。presenter工厂中同样需要,那我们继续,看一下如何创建订阅者的,直接上代码:



/**
 * Created by cuieney on 16/5/19.
 */
public class NetWorkDao<T> {
    public  static NetWorkDao netWorkDao;

    public NetWorkDao() {
    }

    public synchronized static NetWorkDao getInstance(){
        if (netWorkDao == null) {
            netWorkDao  = new NetWorkDao();
        }
        return netWorkDao;
    }

    public Subscriber createSubscriber(final CallBackListener<? super T> callBackListener){
        Subscriber mSubscriber = new Subscriber<T>(){

            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {
                callBackListener.onFailed(e);
            }

            @Override
            public void onNext(T t) {
                callBackListener.onSuccess(t);
            }
        };

        return mSubscriber;
    }

}
可以看到在我们创建订阅者的时候,把要回调的接口已经传入,通过model工厂完成了callbacklistener的监听,然后在订阅者这的方法回调中来做监听。

public interface CallBackListener<T> {
    void onSuccess(T t);
    void onFailed(Throwable throwable);
}
callbacklistener也就是一个简单的回接口的实现,重点来了,我们在presenter中如何使用工厂中的model呢,还是那句话直接上代码。本人语言表达能力比较差

public class PresenterFactory {
    public static PresenterFactory business;
    public Object parameters;

    public static PresenterFactory getInstance(){
        if (business == null) {
            business = new PresenterFactory();
        }
        return business;
    }

    public PresenterFactory setParameters(Object objects){
        parameters = objects;
        return business;
    }

    public PresenterFactory setPost(Object... objects){

        return business;
    };



    public void getRadioListPresenter(final ViewFactory<PlayRadioListEntity> radioListView){
        ModeFactory.getInstance().radioListBus(parameters, new CallBackListener<PlayRadioListEntity>() {
            @Override
            public void onSuccess(PlayRadioListEntity playRadioListEntity) {
                radioListView.onSuccess(playRadioListEntity);
            }

            @Override
            public void onFailed(Throwable throwable) {
                radioListView.onFailed(throwable);
            }
        });

    }

    public void getRadioPresenter(final ViewFactory<List<RadiosListEntity>> radioView){
       ModeFactory.getInstance().radioBus(new CallBackListener<List<RadiosListEntity>>() {
           @Override
           public void onSuccess(List<RadiosListEntity> radiosListEntities) {
                radioView.onSuccess(radiosListEntities);
           }

           @Override
           public void onFailed(Throwable throwable) {
                radioView.onFailed(throwable);
           }
       });
    }

    public void getSongPresenter(final ViewFactory<List<SongsListEntity>> songView){
        ModeFactory.getInstance().songBus("hot", new CallBackListener<List<SongsListEntity>>() {
            @Override
            public void onSuccess(List<SongsListEntity> songsListEntities) {
                songView.onSuccess(songsListEntities);
            }

            @Override
            public void onFailed(Throwable throwable) {
                songView.onFailed(throwable);
            }
        });
    }

由上面的代码可以看出,我们可以在presenter工厂中做一件事情,当我们的retrofit服务需要传入参数的时候我们可以这样调用,先把参数传入,然后在获取相应的presenter,我这里没有做post请求参数的处理,制作了单个参数的处理,大家可以根据自己的需求自己写入相应的方法。通过实例化presenter工厂类,然后再调用相应的presenter,,由于viewfactory也只有一个,所以我们会在presenter中做许多事情,把view层的代码简化了。那么我们来看一下viewfactory如何编写的呢

/**
 * Created by cuieney on 16/5/19.
 */
public interface ViewFactory<T> {
    void onSuccess(T t);
    void onFailed(Throwable throwable);
}
简单吧和callback listener是一样的,只不过换了名称,这样我们在presenter中就可以随意的参入参数进行调用了。那么我们来看一下,如何在调用的地方如何使用呢!看了这么多的代码,大家应该也明白了一些东西,可以直接通过presenter工厂类的单例直接获取,省了不少麻烦啊

PresenterFactory.getInstance()
        .setParameters(new PlayRadioReq("", "", true))
        .getRadioListPresenter(this);
是不是很简单,一句代码搞定了网路请求,同事降低了view和model层的耦合性。小的工程确实看起来起不了多大的作用,而且还增加了代码量,但是对于大的项目和单元测试方面,确实起到了不少的作用。废话不多说,希望大家可以下学到一点东西。竟然在上班时间写这东西,哈哈不过老板不在 微笑


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值