您的位置:首页 > 移动开发 > Android开发

Android中的RxJava,Retrofit,MVP的使用

2016-04-25 01:03 519 查看
RxJava,Retrofit,MVP都是近几年讨论的比较热门的话题,我们也来凑个热闹!

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

先来说一下MVP(Model View Presenter)熟悉MVC结构的应该很容易理解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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android mvp rxjava retrofit