Android中的RxJava,Retrofit,MVP的使用

RxJava,Retrofit,MVP都是近几年讨论的比较热门的话题,下面就来分析一下在项目中的应用

本博不展开讨论,分别讨论的文章有很多,后续有时间给出RxJava,Retrofit的源码分析

先来说一下MVP(Model View Presenter)熟悉MVC结构的应该很容易理解MVP,这里先给出MVP的图解

MVP图解

  • model具体业务逻辑处理的实现
  • view负责显示数据、提供友好界面跟用户交互
  • presenter负责完成View于Model间的交互

下面给出一个使用这三者的demo,由于使用Retrofit和RxJava,数据获取的过程变得很简洁,此demo没有按照严格的MVP结构,遵从了数据和view分开处理的原则,降低了代码的耦合度,少定义几个接口

View代码层

package com.zimo.guo.activity;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

import com.zimo.guo.R;
import com.zimo.guo.model.BannerVO;
import com.zimo.guo.presenter.BannerPresenter;

import java.util.List;

import butterknife.Bind;
import butterknife.ButterKnife;

public class MainActivity extends AppCompatActivity implements LoadingBannerView{

    @Bind(R.id.show_banner_string)
    TextView showBanner;

    BannerPresenter presenter;

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

        presenter = new BannerPresenter(MainActivity.this);
        presenter.loadData();
    }

    @Override
    public void showData(List<BannerVO> bannerVOs) {
      showBanner.setText(bannerVOs.get(0).getPicUrl());
    }

    @Override
    public void showNetworkErrorView() {

    }

    @Override
    public void hideNetworkErrorView() {

    }

    @Override
    public void showLoading() {

    }

    @Override
    public void hideLoading() {

    }

    @Override
    public void showEmptyView() {

    }

    @Override
    public void hideEmptyView() {

    }

    @Override
    public void showError(String message) {

    }
}

写的比较简单,根据需求私人私人定制

view层的接口

package com.zimo.guo.activity;

import com.zimo.guo.model.BannerVO;

import java.util.List;

/**
 * @Description:
 * @author: zimo
 * @date: 2016-04-25
 */
public interface LoadingBannerView extends LoadingDataView{

    void showData(List<BannerVO> bannerVOs);
}

package com.zimo.guo.activity;

import java.util.List;

/**
 * @Description: 加载数据
 * @author: zimo
 * @date: 2016-04-06
 */
public interface LoadingDataView {

    void showNetworkErrorView();

    void hideNetworkErrorView();

    void showLoading();

    void hideLoading();

    void showEmptyView();

    void hideEmptyView();

    void showError(String message);
}

present层代码

package com.zimo.guo.presenter;

import com.zimo.guo.activity.LoadingBannerView;
import com.zimo.guo.exception.NetworkConnectionException;
import com.zimo.guo.model.BannerVO;
import com.zimo.guo.network.service.HttpService;
import com.zimo.guo.rx.operator.OperatorRequestMap;

import java.util.List;

import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.schedulers.Schedulers;

/**
 * @Description:
 * @author: zimo
 * @date: 2016-04-25
 */
public class BannerPresenter implements CommonPresenter {

    LoadingBannerView view;

    public BannerPresenter(LoadingBannerView view) {
        this.view = view;
    }

    @Override
    public void loadData() {
        HttpService.getInstance().getCommonApi().getBannerList("", "", "", "")
                .lift(new OperatorRequestMap<List<BannerVO>>())
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<List<BannerVO>>() {
                    @Override
                    public void call(List<BannerVO> bannerVOs) {
                        if (bannerVOs != null && bannerVOs.size() > 0) {
                            view.showData(bannerVOs);
                        }else {
                            view.showEmptyView();
                        }
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        if (throwable instanceof NetworkConnectionException) {
                            view.showNetworkErrorView();
                        }
                    }
                });
    }
}

present层的接口

package com.zimo.guo.presenter;

/**
 * @Description:
 * @author: zimo
 * @date: 2016-04-25
 */
public interface CommonPresenter {

    void loadData();
}

model层主要是实体,省略一百行代码…

RxJava使用

package com.zimo.guo.network.service;

import com.zimo.guo.BuildConfig;
import com.zimo.guo.constants.HttpContants;
import com.zimo.guo.network.api.CommonApi;

import java.io.IOException;

import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;

/**
 * @Description: http
 * @author: zimo
 * @date: 2016-04-24
 */
public class HttpService {

    private CommonApi commonApi;

    private HttpService() {
        Retrofit.Builder builder = new Retrofit.Builder().addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl(HttpContants.DEFAULT_HOST_URL);
        OkHttpClient.Builder okHttpBuilder = new OkHttpClient.Builder().addNetworkInterceptor(new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request request = chain.request();
                Request newReq = request.newBuilder()
                        .build();
                return chain.proceed(newReq);
            }
        });

        if (BuildConfig.DEBUG){
            HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
            okHttpBuilder.addInterceptor(loggingInterceptor);
        }

        OkHttpClient client = okHttpBuilder.build();
        builder.client(client);
        commonApi = builder.build().create(CommonApi.class);
    }

    private static class HttpServiceHandler{
        public static final HttpService INSTANCE = new HttpService();
    }

    public static HttpService getInstance(){
        return HttpServiceHandler.INSTANCE;
    }

    public static CommonApi getCommonApi() {
        return HttpService.getInstance().commonApi;
    }
}

retrofit的使用

package com.zimo.guo.network.api;


import com.zimo.guo.model.BannerVO;
import com.zimo.guo.model.BaseBean;

import java.util.List;

import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
import rx.Observable;

/**
 * @Description:
 * @author: zimo
 * @date: 2016-04-24
 */
public interface CommonApi {

    @FormUrlEncoded
    @POST("")
    Observable<BaseBean<List<BannerVO>>> getBannerList(@Field("") String method, @Field("") String bannerUpdateVer, @Field("") String sessionKey,
                                                       @Field("") String bannerType);
}

欲知详情,请听下回解说

Demo地址:https://github.com/zimoguo/MVPDemo

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值