mvp retrofit rxjava+rxjava如何判断是否有没有网络

Retrofit+Rxjava 网络请求的完美封装(二)(观察者模式)
上一篇是Retrofit+Rxjava简单封装,是在MainActivity中构建的请求体,这篇博文是将请求体Request也置入到Rxjava中,我通过公司一个上线App接口来进行Retrofit+Rxjava 的简单学习
/api/v1.0/DeletePrivateContact
当然你直接访问上面的url是无法获取服务器Json数据的,因为是需要封装请求体,如下是在没有封装请求体,返回的错误界面
Method Not Allowed
The method is not allowed for the requested URL.
首先看下请求的Json格式如下
[getJuheResult]requestJsonStr =
&contact_ids&: [
&godin_id&: &4c74bddf36e&,
&imei&: &345&,
&phone_num&: &&
返回的Json格式如下,如下是一种返回的格式:
[getJuheResult.onNext]Head{statuscode=';, statusmsg='device and user not match'}
这篇博客就对上篇博客的进行Retrofit+Rxjava 简单封装在进行请求体的封装
首先看看上篇博客在MainActivity中封装的HttpRequest请求
ArrayList contact_ids = new ArrayList&&();
contact_ids.add(&0&);
HttpRequest httpRequest = new HttpRequest();
httpRequest.setPhone_num(&&);
httpRequest.setImei(&345&);
httpRequest.setGodin_id(&4c74bddf36e&);
httpRequest.setContact_ids(contact_ids);
封装之后呢?在上篇博客中,在通过参数传递进来
public void postClickAppInfoParameterJsonBody(HttpRequest request) {
if (request == null) {
throw new NullPointerException(&Argument request cannot be null.&);
Log.d(TAG,&[getJuheResult]requestJsonStr = \n&+gson.toJson(jsonParser.parse(gson.toJson(request))));
FactoryInters.PostClickAppInfoParameterJsonBody server = retrofit.create(FactoryInters.PostClickAppInfoParameterJsonBody.class);
Subscriber subscriber = new HttpResultSubscriber(&getJuheResult&);
server.getJuheResult(request)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.mainThread())
.subscribe(subscriber);
如上的方式,其实我们可以将它也放到Rxjava中封装起来,通过Rxjava直接传递进来
1、在Rxjava中构建HttpRequest进行传递或者根据业务需要进行转换(当然如果请求业务多了,可以另起一个类统一管理)
* 设置线程
Observable setThread(Observable observable) {
observable.subscribeOn(Schedulers.from(exector))
.observeOn(AndroidSchedulers.mainThread());
* 上传服务器删除联系人操作
public void postClickAppInfoParameterJsonBody() {
//被观察者。。。
RxHelper.getInstance().setThread(Observable.create(new Observable.OnSubscribe() {
public void call(Subscriber subscriber) {
ArrayList contact_ids = new ArrayList&&();
contact_ids.add(&0&);
HttpRequest httpRequest = new HttpRequest();
httpRequest.setPhone_num(&&);
httpRequest.setImei(&345&);
httpRequest.setGodin_id(&4c74bddf36e&);
httpRequest.setContact_ids(contact_ids);
subscriber.onNext(httpRequest);
.subscribe(new Action1() {
public void call(HttpRequest request) {
RetrofitManger.getInstance().postClickAppInfoParameterJsonBody(request);
2、将HttpRequest传递过来之后,就开始进行Retrofit方面的封装首先看基类RetrofitBase
protected RetrofitBase(){
retrofit = new Retrofit.Builder()
.baseUrl(BASEURL)
.client(client())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
private OkHttpClient client(){
LauncherTrust launcherTrust = new LauncherTrust();
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(TIMEOUT, TimeUnit.MILLISECONDS)
.readTimeout(TIMEOUT,TimeUnit.MILLISECONDS)
.sslSocketFactory(sslSocketFactory(launcherTrust),launcherTrust)
.hostnameVerifier(new AllowAllHostnameVerifier())
return okHttpC
3、我们看下Retrofit通过特有的注解方式,配置请求HttpRequest,返回HttpResult的代码接口,跟Rxjava结合起来,然后在第4步操作中,通过Rxjava的观察者模式进行响应操作
public interface FactoryInters {
///api/v1.0/DeletePrivateContact
interface PostClickAppInfoParameterJsonBody{
@Headers({&Content-Type: application/json&,&Accept: application/json&})
@POST(&DeletePrivateContact&)
Observable getJuheResult(@Body HttpRequest request);
4、然后看Retrofit主类,主要处理请求返回数据的传递,异步响应操作
* {&phone_num&: &&, &imei&: &345&, &godin_id&: &4c74bddf36e&, &contact_ids&: [&0&]}
public void postClickAppInfoParameterJsonBody(HttpRequest request) {
if (request == null) {
throw new NullPointerException(&Argument request cannot be null.&);
Log.d(TAG,&[getJuheResult]requestJsonStr = \n&+gson.toJson(jsonParser.parse(gson.toJson(request))));
FactoryInters.PostClickAppInfoParameterJsonBody server = retrofit.create(FactoryInters.PostClickAppInfoParameterJsonBody.class);
Subscriber subscriber = new HttpResultSubscriber(&getJuheResult&);
server.getJuheResult(request)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
private class HttpResultSubscriber extends Subscriber{
public HttpResultSubscriber(String methodTag){
this.method = methodT
public void onCompleted() {
Log.i(TAG, &onCompleted&);
public void onError(Throwable e) {
StringBuffer sb = new StringBuffer();
sb.append(&[&).append(method).append(&.onError]&).append(e);
Log.e(TAG,sb.toString());
public void onNext(HttpResult httpResult) {
StringBuffer sb = new StringBuffer();
sb.append(&[&).append(method).append(&.onNext]&)
.append(httpResult.getHead().toString());
Log.i(TAG,sb.toString());
如下的代码,就是Rxjava观察者模式的使用,就是通过传递HttpRequest,获取HttpResult结果,然后在通过构建被观察者,观察者进行事件传递,响应操作和处理
server.getJuheResult(request)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
最后再次看下请求体,响应结果如下:
11-03 14:48:23.526 /? D/RetrofitManger: [getJuheResult]requestJsonStr =
&contact_ids&: [
&godin_id&: &4c74bddf36e&,
&imei&: &345&,
&phone_num&: &&
11-03 14:48:23.758 /? I/RetrofitManger: [getJuheResult.onNext]Head{statuscode=';, statusmsg='device and user not match'}
&&&&&&&&&&&&&&&以下是代码区&&&&&&&&&&&&&&&
配置文件:
HttpRequest
package com.godinsec.
import java.util.ArrayL
* 删除联系人封装的请求体
* {&phone_num&: &&, &imei&: &345&, &godin_id&: &4c74bddf36e&, &contact_ids&: [&0&]}
public class HttpRequest {
private String phone_
private String godin_
private ArrayList contact_
public ArrayList getContact_ids() {
return contact_
public void setContact_ids(ArrayList contact_ids) {
this.contact_ids = contact_
public String getPhone_num() {
return phone_
public void setPhone_num(String phone_num) {
this.phone_num = phone_
public String getImei() {
public void setImei(String imei) {
this.imei =
public String getGodin_id() {
return godin_
public void setGodin_id(String godin_id) {
this.godin_id = godin_
public String toString() {
return &HttpRequest{& +
&phone_num='& + phone_num + '\'' +
&, imei='& + imei + '\'' +
&, godin_id='& + godin_id + '\'' +
&, contact_ids=& + contact_ids +
'}';
HttpResult
package com.godinsec.
import java.util.ArrayL
* 删除正确返回的json格式
* {&head&: {
* &statuscode&: &000000&,
* &statusmsg&: &success&
public class HttpResult {
public String toString() {
return &HttpResult{& +
&head=& + head +
'}';
public Head getHead() {
public void setHead(Head head) {
this.head =
public static class Head {
public String getStatuscode() {
public void setStatuscode(String statuscode) {
this.statuscode =
public String getStatusmsg() {
public void setStatusmsg(String statusmsg) {
this.statusmsg =
public String toString() {
return &Head{& +
&statuscode='& + statuscode + '\'' +
&, statusmsg='& + statusmsg + '\'' +
'}';
RxJavaHelper
package com.godinsec.
import java.util.ArrayL
import java.util.concurrent.ExecutorS
import java.util.concurrent.E
import java.util.concurrent.ThreadF
import java.util.concurrent.atomic.AtomicI
import rx.O
import rx.S
import rx.android.schedulers.AndroidS
import rx.functions.Action1;
import rx.schedulers.S
* Created by Safly on .
public final class RxJavaHelper {
private ExecutorService exector =
private RxJavaHelper() {
exector = Executors.newFixedThreadPool(5, new ThreadFactory() {
public Thread newThread(Runnable r) {
AtomicInteger mCount = new AtomicInteger(1);
Thread thread = new Thread(r, &PrivacyLauncherThread_id:& + mCount.getAndIncrement());
thread.setPriority(Thread.NORM_PRIORITY - 1);
private static final class Factory {
private static final RxJavaHelper instance = new RxJavaHelper();
public static RxJavaHelper getInstance() {
return Factory.
* 设置线程
Observable setThread(Observable observable) {
observable.subscribeOn(Schedulers.from(exector))
.observeOn(AndroidSchedulers.mainThread());
* 上传服务器删除联系人操作
public void postClickAppInfoParameterJsonBody() {
//被观察者。。。
RxJavaHelper.getInstance().setThread(Observable.create(new Observable.OnSubscribe() {
public void call(Subscriber subscriber) {
ArrayList contact_ids = new ArrayList&&();
contact_ids.add(&0&);
HttpRequest httpRequest = new HttpRequest();
httpRequest.setPhone_num(&&);
httpRequest.setImei(&345&);
httpRequest.setGodin_id(&4c74bddf36e&);
httpRequest.setContact_ids(contact_ids);
subscriber.onNext(httpRequest);
.subscribe(new Action1() {
public void call(HttpRequest request) {
RetrofitManger.getInstance().postClickAppInfoParameterJsonBody(request);
RetrofitBase
package com.godinsec.
import com.godinsec.db.RxJavaH
import org.apache.http.conn.ssl.AllowAllHostnameV
import java.security.KeyManagementE
import java.security.NoSuchAlgorithmE
import java.security.SecureR
import java.security.cert.CertificateE
import java.security.cert.X509C
import java.util.concurrent.TimeU
import javax.net.ssl.SSLC
import javax.net.ssl.SSLSocketF
import javax.net.ssl.TrustM
import javax.net.ssl.X509TrustM
import okhttp3.OkHttpC
import retrofit2.R
import retrofit2.adapter.rxjava.RxJavaCallAdapterF
import retrofit2.converter.gson.GsonConverterF
* Created by Seeker on .
public abstract class RetrofitBase {
private static final String BASEURL = &https://10.0.5.97:9000/api/v1.0/&;
private static final String BASEURL = &/api/v1.0/&;
private static final long TIMEOUT = 5 * 1000;
protected R
protected RetrofitBase(){
retrofit = new Retrofit.Builder()
.baseUrl(BASEURL)
.client(client())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
private OkHttpClient client(){
LauncherTrust launcherTrust = new LauncherTrust();
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(TIMEOUT, TimeUnit.MILLISECONDS)
.readTimeout(TIMEOUT,TimeUnit.MILLISECONDS)
.sslSocketFactory(sslSocketFactory(launcherTrust),launcherTrust)
.hostnameVerifier(new AllowAllHostnameVerifier())
return okHttpC
private SSLSocketFactory sslSocketFactory(LauncherTrust launcherTrust){
SSLContext sslContext = SSLContext.getInstance(&TLS&);
sslContext.init(null,new TrustManager[]{launcherTrust},new SecureRandom());
return sslContext.getSocketFactory();
} catch (NoSuchAlgorithmException | KeyManagementException e) {
e.printStackTrace();
static class LauncherTrust implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
RetrofitManger
package com.godinsec.
import android.os.H
import android.os.L
import android.util.L
import com.google.gson.G
import com.google.gson.GsonB
import com.google.gson.JsonP
import java.util.ArrayL
import retrofit2.C
import retrofit2.C
import retrofit2.R
import rx.S
import rx.android.schedulers.AndroidS
import rx.schedulers.S
* {&resultcode&:&101&,&reason&:&错误的请求KEY!&,&result&:null,&error_code&:10001}
public class RetrofitManger extends RetrofitBase {
private static final String TAG = &RetrofitManger&;
private JsonParser jsonP
private RetrofitManger() {
gson = new GsonBuilder().setPrettyPrinting().create();
jsonParser = new JsonParser();
private static final class Factory {
private static final RetrofitManger instance = new RetrofitManger();
public static RetrofitManger getInstance() {
return Factory.
* {&phone_num&: &&, &imei&: &345&, &godin_id&: &4c74bddf36e&, &contact_ids&: [&0&]}
public void postClickAppInfoParameterJsonBody(HttpRequest request) {
if (request == null) {
throw new NullPointerException(&Argument request cannot be null.&);
Log.d(TAG,&[getJuheResult]requestJsonStr = \n&+gson.toJson(jsonParser.parse(gson.toJson(request))));
FactoryInters.PostClickAppInfoParameterJsonBody server = retrofit.create(FactoryInters.PostClickAppInfoParameterJsonBody.class);
Subscriber subscriber = new HttpResultSubscriber(&getJuheResult&);
server.getJuheResult(request)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
private class HttpResultSubscriber extends Subscriber{
public HttpResultSubscriber(String methodTag){
this.method = methodT
public void onCompleted() {
Log.i(TAG, &onCompleted&);
public void onError(Throwable e) {
StringBuffer sb = new StringBuffer();
sb.append(&[&).append(method).append(&.onError]&).append(e);
Log.e(TAG,sb.toString());
public void onNext(HttpResult httpResult) {
StringBuffer sb = new StringBuffer();
sb.append(&[&).append(method).append(&.onNext]&)
.append(httpResult.getHead().toString());
Log.i(TAG,sb.toString());
FactoryInters
package com.godinsec.
import java.util.M
import retrofit2.C
import retrofit2.http.B
import retrofit2.http.GET;
import retrofit2.http.H
import retrofit2.http.POST;
import retrofit2.http.Q
import retrofit2.http.QueryM
import rx.O
public interface FactoryInters {
///api/v1.0/DeletePrivateContact
interface PostClickAppInfoParameterJsonBody{
@Headers({&Content-Type: application/json&,&Accept: application/json&})
@POST(&DeletePrivateContact&)
Observable getJuheResult(@Body HttpRequest request);
MainActivity
package com.godinsec.
import android.app.A
import android.os.B
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RxJavaHelper.getInstance().postClickAppInfoParameterJsonBody();在软件开发中,开发一个新的项目之前,我们肯定会先对整个项目搭建一个框架,以便于提高开发效率,统一代码风格,简化维护成本。当然,Android开发也一样。对于Android而言,普遍化的实现方式可能就是组合开源库,一般包括网络框架(OkHttp, Retrofit, Vollay等),数据传输协议(Gson, Json, ProtocolBuf等),图片加载框架(ImageLoader, Picasco, Fresco, Glide等),事件通知组件(EventBus, RxJava等),然后通过二次封装来完成。
关于MVP模式可参见上一篇文章:
这里我们通过Rxtrofit+RxJava+Gson组合的形式搭建一个简单的MVP模式的框架。其基本结构如下:
下面我们先通过Rxtrofit+RxJava对网络层进行二次封装,以简化用户的数据请求过程。
这里我们就按照MVP的三层接口来进行封装,将网络层归档到Model层中。
Model层采用的数据传输格式:
&code&: 1,
&msg&: &\u64cd\u4f5c\uf&,
&data&: []
code: 表示服务器的返回代码(如1表示成功,0表示失败等);
表示服务器对客户端返回的消息;
data: 存储服务器返回给客户端的数据;
代码实现:
数据模型的基类(实现Model Gson化,便于调试与数据转化):
public abstract class BaseBean {
public String toJson() {
return toJson(this);
public static String toJson(BaseBean bean) {
if (bean != null) {
return new Gson().toJson(bean);
public static &T extends BaseBean& T fromJson(String jsonStr,
Class&? extends BaseBean& subClass) {
BaseBean newObj = new Gson().fromJson(jsonStr,
subClass);
return (T) newO
public String toString() {
return toJson();
数据协议的基类:
public class BaseProtocolBean extends BaseBean implements Serializable {
* 服务器的返回代码
* 服务器的返回消息
具体接口使用的数据模型示例:
public class ExampleBean extends BaseProtocolBean {
public ExampleDetailB
public static class ExampleDetailBean extends BaseBean {
// 具体的字段定义
至此,数据协议部分我们就完成了,在使用时,我们只需要按照上面的使用示例,对Model进行定义,然后在网络请求中使用即可。下面我们通过Retrofit+RxJava对网络层进行封装。(这里我们只对异步请求过程进行封装)
数据请求过程:
public class BaseHttpQuery&T extends BaseProtocolBean& {
private BasePresenter mP
private APIService apiS
private final int ERROR_CODE_DEFAULT = -1;
private final String BASE_URL = &http://192.168.1.1/&;
public BaseHttpQuery(BasePresenter presenter) {
this.mPresenter =
public APIService getAPIService() {
if (apiService == null) {
Retrofit retrofit = new Retrofit.Builder()
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(BASE_URL)
apiService = retrofit.create(APIService.class);
return apiS
public void setObservable(Observable observable) {
if (observable != null && mPresenter != null) {
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer&T&() {
public void onNext(T value) {
if (value != null) {
if (value.code == 1) {
mPresenter.onSuccess(value);
mPresenter.onFailure(value.code, value.msg);
mPresenter.onFailure(ERROR_CODE_DEFAULT, &数据解析失败&);
public void onError(Throwable e) {
mPresenter.onFailure(ERROR_CODE_DEFAULT, e.getMessage());
public void onCompleted() {
通过传入的Presenter, 在网络请求完成后,回调Presenter层相应的方法(onSuccess或onFailure), 这样用户只需要在Presenter中这两个方法中处理相应的逻辑即可。
实际上,目前市场上的App,为了统计数据,一般都需要App上传手机的一些基本参数作为每个接口的公共信息,既然OKHttp可以办到,那么作为OkHttp的封装框架自然也提供了这样的功能。Retrofit可以设置自定义的okhttp客户端,所以我们只需要自定义一个拦截器, 将这些公共参数拼接在请求中, 然后设置Retrofit的OKHttpClient即可:
在请求中拼接公共参数
public class BaseInterceptor implements Interceptor {
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
HttpUrl.Builder builder = request.url()
.newBuilder()
.scheme(request.url().scheme())
.host(request.url().host())
.addQueryParameter(&appver&, &&)
.addQueryParameter(&sysver&, &android&)
.addQueryParameter(&channel&, &&)
.addQueryParameter(&carrier&, &&)
.addQueryParameter(&network&, &&)
.addQueryParameter(&res&, &&)
.addQueryParameter(&did&, &&)
.addQueryParameter(&mac&, &&)
.addQueryParameter(&token&, &&);
Request newRquest = request.newBuilder()
.method(request.method(), request.body())
.url(builder.build())
return chain.proceed(newRquest);
然后在创建Retrofit对象时,设置新的OkHttpClient:
OkHttpClient httpClient = new OkHttpClient.Builder().addInterceptor(new BaseInterceptor()).build();
Retrofit retrofit = new Retrofit.Builder()
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.client(httpClient)
.baseUrl(BASE_URL)
这样在网络请求时每个接口都会携带公共参数了。至此,整个Model层和网络层就已完成。
Presenter层
Presenter的基本结构
public interface BasePresenter&T& {
* request data from remote or database.
void requestData();
* callback onSuccess when request data success.
* @param data
void onSuccess(T data);
* callback onFailure when request data fail.
* @param code: error code.
* @param msg: error message.
void onFailure(int code, String msg);
Presenter层的使用示例:
public class TestPresenter&T extends BaseView& implements BasePresenter&DesignerListBean& {
private T mBaseV
public TestPresenter(T baseView) {
requestData();
this.mBaseView = baseV
public void requestData() {
// 请求数据的过程
BaseHttpQuery&DesignerListBean& query = new BaseHttpQuery&DesignerListBean&(this);
query.setObservable(query.getAPIService().getData(&1&);
public void onSuccess(DesignerListBean data) {
// 数据请求成功后调用View(Fragment/Activity中的loadView获取View,init(data)加载数据等)
mBaseView.loadView();
mBaseView.init(data);
public void onFailure(int code, String msg) {
// 数据请求失败后加载相应的布局
mBaseView.showFailureUI();
// shixian
View层为了提供开发效率,统一代码风格,我们对View层也进行简单的封装。
public interface BaseView {
* set presenter makes it associated with activity/fragment,
* and request data from remote or database.
void startPresenter();
* 获取布局文件 example: return R.layout.test_
int getLayoutId();
* 获取布局中的View
void getViews();
* 为View关联数据,设置View事件
* @param data
void init(T data);
* 网络请求失败时加载相应的布局
void showFailureUI();
* 数据请求成功后被调用:加载布局,获取View
void loadView();
* 显示提醒消息
* @param hint
void showHint(String hint);
BaseActivity
public abstract class BaseActivity&T extends BasePresenter, G extends BaseBean& extends Activity implements BaseView&G& {
// 请求网络时是否显示加载布局,true表示显示,否则不显示
protected boolean showLoadingUI =
// 页面是否需要网络请求 true表示需要,否则不需要
protected boolean needRequest =
protected T mP
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
startPresenter();
if (needRequest) {
if (showLoadingUI) {
setContentView(R.layout.activity_loading_layout);
setContentView(getLayoutId());
setContentView(getLayoutId());
getViews();
init(null);
public void loadView() {
if (showLoadingUI) {
setContentView(getLayoutId());
getViews();
public void showFailureUI() {
View emptyView = getLayoutInflater().inflate(R.layout.activity_empty_layout, null);
setContentView(emptyView);
emptyView.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
mPresenter.requestData();
public void showHint(String hint) {
ToastUtil.show(this, hint);
当然,作为View层的Fragment也应该进行简单的封装:
BaseFragment
public abstract class BaseProgressFragment2&T extends BasePresenter, G extends BaseBean& extends Fragment implements BaseView&G& {
protected View mRootL
protected T mP
private FrameLayout mViewC
private LayoutInflater mI
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
startPresenter();
this.mInflater =
View loadingView = inflater.inflate(R.layout.fragment_loading_layout, container, false);
mViewContaner = (FrameLayout) loadingView.findViewById(R.id.content_container);
return loadingV
public void loadView() {
mViewContaner.removeAllViews();
mRootLayout = mInflater.inflate(getLayoutId(), null);
mViewContaner.addView(mRootLayout);
getViews();
public void showFailureUI() {
mViewContaner.removeAllViews();
View emptyLayout = mInflater.inflate(R.layout.fragment_loading_layout, null);
mViewContaner.addView(emptyLayout);
emptyLayout.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (mPresenter != null) {
mPresenter.requestData();
public void showHint(String hint) {
ToastUtil.show(getActivity(), hint);
至此,View层的封装就完成了。在页面开发中,我们只需要继承BaseActivity或BaseFragment实现相应的函数即可。
总结这里我们只是实现了Retrofit+RxJava实现了一个MVP的基本框架,其目的是展现如何将MVP的架构应用在项目中。对于不同的需求,不同的业务,还是需要做出相应的调整。对于其中存在的问题,欢迎指正!}

我要回帖

更多关于 rxjava retrofit demo 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信