引用

"retrofit"              : "com.squareup.retrofit2:retrofit:2.0.1",
"retrofit-adapter" : "com.squareup.retrofit2:adapter-rxjava:2.0.1",
"retrofit-converter" : "com.squareup.retrofit2:converter-gson:2.0.1", "gson" : "com.google.code.gson:gson:2.6.2", "rxjava" : "io.reactivex:rxjava:1.1.2",
"rxandroid" : "io.reactivex:rxandroid:1.1.0", "okhttp" : "com.squareup.okhttp3:okhttp:3.2.0",
"okhttp-urlconnection" : "com.squareup.okhttp3:okhttp-urlconnection:3.2.0",
"okhttp-logging" : "com.squareup.okhttp3:logging-interceptor:3.2.0",
"okhttp-cookie" : "com.github.franmontiel:PersistentCookieJar:v0.9.3",

Retrofit

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.util.concurrent.TimeUnit; import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory; /**用于辅助初始化retrofit**/
public class RxService { private static final long DEFAULT_TIMEOUT = 20L; final static Gson gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
.serializeNulls()// 调用serializeNulls方法,改变gson对象的默认行为,null值将被输出
.create(); //addInterceptor:设置应用拦截器,可用于设置公共参数,头信息,日志拦截等
//addNetworkInterceptor:网络拦截器,可以用于重试或重写,对应与1.9中的setRequestInterceptor。
//setLevel NONE(不记录) BASIC(请求/响应行) HEADER(请求/响应行 + 头) BODY(请求/响应行 + 头 + 体)
//cookieJar:保持在同一个会话里面
//TimeUnit.SECONDS秒做单位
private static OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addNetworkInterceptor(new HttpLoggingInterceptor()
.setLevel(HttpLoggingInterceptor.Level.HEADERS))
.addInterceptor(new HttpLoggingInterceptor()
.setLevel(HttpLoggingInterceptor.Level.BODY))
.cookieJar(App.getInstance().getCookieJar())
.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
.readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
.build(); private static Retrofit retrofit = null; private RxService() {} // private final static RxService rxService = new RxService(); public static <T> T createApi(Class<T> clazz,String url) {
retrofit = new Retrofit.Builder()
.baseUrl(url)
.client(okHttpClient)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
return retrofit.create(clazz);
} public static <T> T createApi(Class<T> clazz) {
retrofit = new Retrofit.Builder()
.baseUrl(Config.BASE_DEFAULT)
.client(okHttpClient)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
return retrofit.create(clazz);
} }
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
import rx.Observable; /**
* Created by JDD on 2016/4/8.
*/
public interface ILoginService { @FormUrlEncoded
@POST(LoginSingleService.URL)
Observable<UsersEntity> login(@Field("token") String token, @Field("userName") String userName, @Field("userPassword") String userPassword);
}
/**创建并配置retrofit service**/
public class LoginSingleService { public static final String URL = "login.do";
protected static final Object monitor = new Object();
static ILoginService sJokeSingleton = null;
// public static final int meizhiSize = 10;
// public static final int gankSize = 5; //测试service
public static ILoginService getLoginSingleton() {
synchronized (monitor) {
if (sJokeSingleton == null) {
sJokeSingleton = RxService.createApi(ILoginService.class);
}
return sJokeSingleton;
}
} }
Presenter
import android.util.Log;
import rx.Observer;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers; public class LoginPresenter implements ILoginPresenter { public Subscription login(final String username,final String pwd, final CallBack callBack) {
if (username == null || pwd == null || username.equals("") || pwd.equals("")){
callBack.Error(STATUS.NULL_ERROR);
return null;
}
//观察者Subscription
Subscription s = LoginSingleService.getLoginSingleton()//事件源,被观察者Observable
.login("21341234",username,pwd)
.subscribeOn(Schedulers.io())//指定观察者运行的线程
.map(entity -> entity.getData())
.observeOn(AndroidSchedulers.mainThread())//指定订阅者运行的线程
.subscribe(new Observer<UserEntity>() {//订阅subscriber
@Override
public void onCompleted() {
Log.e("onNext","onCompleted");
callBack.End();
} @Override
public void onError(Throwable e) {
Log.e("onNext","onError "+e.getMessage());
callBack.Error(STATUS.ERROR);
} @Override
public void onNext(UserEntity entity) {
STATUS status;
if (entity != null) {
status = STATUS.SUCCESS;
Log.e("onNext","hello "+entity.getName());
App.getInstance().setUserEntity(entity);
App.getInstance().setPerson(entity,pwd);
}
else
status = STATUS.ERROR; callBack.Success(status);
}
});
return s;
} }

Main

import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import rx.Subscription;
import rx.subscriptions.CompositeSubscription; /**
* Created by LiuZhen on 2016/5/11.
*/
public abstract class BaseActivity extends AppCompatActivity { private final static String TAG = "BaseActivity";
private CompositeSubscription mCompositeSubscription;
protected Context context; @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayoutId()); this.context = BaseActivity.this;
} public CompositeSubscription getCompositeSubscription() {
if (this.mCompositeSubscription == null) {
this.mCompositeSubscription = new CompositeSubscription();
} return this.mCompositeSubscription;
}
/**使CompositeSubscription持有订阅**/
public void addSubscription(Subscription s) {
if (this.mCompositeSubscription == null) {
this.mCompositeSubscription = new CompositeSubscription();
} this.mCompositeSubscription.add(s);
} @Override
protected void onDestroy() {
super.onDestroy();
if (this.mCompositeSubscription != null) {
this.mCompositeSubscription.unsubscribe();//取消所有的订阅
}
} protected abstract int getLayoutId(); }
import android.os.Bundle;
import android.widget.TextView; import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode; public class MainActivity extends BaseActivity { private TextView username; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); EventBus.getDefault().register(this); username = (TextView) findViewById(R.id.username);
username.setText(App.getInstance().getPerson().getName()+" hello");
} @Override
protected int getLayoutId() {
return R.layout.activity_main;
} @Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent() {
Toasts.showShort("刷新UI",context);
} @Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
} }

/**

* Retrofit精髓就在三点。

* 1、动态代理,用注解来生成请求参数;

* 2、适配器模式的应用,请求返回各种CallAdapter,可扩展到RxJava、Java8,还有任何你自己写的Adapter;

* 3、Converter,你可以把请求的响应用各种Converter转成你的需求上.

**/

rxjava有点得注意的就是如果对于涉及了 Activity 或 Fragment 的处理不仔细的话,AsyncTasks 可能会造成内存泄露。不幸的是,使用 RxJava 不会魔术般的缓解内存泄露危机,调用的 Observable.subscribe() 的返回值是一个 Subscription 对象。

Subscription 类只有两个方法,unsubscribe() 和 isUnsubscribed()。为了防止可能的内存泄露,在你的 Activity 或 Fragment 的 onDestroy 里,用 Subscription.isUnsubscribed() 检查你的 Subscription 是否是 unsubscribed。

如果调用了 Subscription.unsubscribe() ,Unsubscribing将会对 items 停止通知给你的 Subscriber,并允许垃圾回收机制释放对象,防止任何 RxJava 造成内存泄露。如果你正在处理多个 Observables 和 Subscribers,所有的 Subscription 对象可以添加到 CompositeSubscription,然后可以使用 CompositeSubscription.unsubscribe() 方法在同一时间进行退订(unsubscribed)

mvp+retrofit+rxjava的更多相关文章

  1. 设计模式笔记之四:MVP+Retrofit+RxJava组合使用

    本博客转自郭霖公众号:http://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650236866&idx=1&sn=da66 ...

  2. Android MVP+Retrofit+RxJava实践小结

    关于MVP.Retrofit.RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava ...

  3. 82.Android之MVP+Retrofit+RxJava实践小结

    转载:http://wuxiaolong.me/2016/06/12/mvpRetrofitRxjava/ 关于MVP.Retrofit.RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛 ...

  4. Android MVP开发模式及Retrofit + RxJava封装

    代码已上传到Github,因为接口都是模拟无法进行测试,明白大概的逻辑就行了! 欢迎浏览我的博客--https://pushy.site 1. MVP模式 1.1 介绍 如果熟悉MVP模式架构的话,对 ...

  5. kotlin for android----------MVP模式下(OKHttp和 Retrofit+RxJava)网络请求的两种实现方式

    今天要说的干货是:以Kotlin,在MVP模式下(OKHttp和 Retrofit+RxJava)网络请求两种实现方式的一个小案例,希望对大家有所帮助,效果图: Retrofit是Square公司开发 ...

  6. 我们为什么要把Dagger2,MVP以及Rxjava引入项目中?

    1Why? 我们为什么要把Dagger2,MVP以及Rxjava引入项目中? 毫无疑问在Android开发圈中这三个技术是经常被提及的,如此多的文章和开源项目在介绍他们,使用他们,开发者也或多或少的被 ...

  7. 优雅地使用Retrofit+RxJava(二)

    前言 在我上一篇讲Retrofit+RxJava在MVP模式中优雅地处理异常(一)中,发现非常多网友发邮箱给我表示期待我的下一篇文章,正好趁着清明假期.我就写写平时我在使用RxJava+Retrofi ...

  8. 带你封装自己的MVP+Retrofit+RxJava2框架(一)

    前言 文本已经收录到我的Github个人博客,欢迎大佬们光临寒舍:我的GIthub博客 看完本篇文章的,可以看下带你封装自己的MVP+Retrofit+RxJava2框架(二),里面封装得到了改进 本 ...

  9. 基于Retrofit+RxJava的Android分层网络请求框架

    目前已经有不少Android客户端在使用Retrofit+RxJava实现网络请求了,相比于xUtils,Volley等网络访问框架,其具有网络访问效率高(基于OkHttp).内存占用少.代码量小以及 ...

随机推荐

  1. EntityFramework之你不知道的那些事(七)

    前言 前面一系列几乎都是循序渐进式的进行叙述,似乎脚步走得太快了,于是我开始歇一歇去追寻一些我所不太了解的细枝末节,在此过程中也屡次碰壁,但是唯有如此才能更好的成长,不是吗!希望此文对你亦有帮助. 属 ...

  2. Android获取内置sdcard跟外置sdcard路径

    Android获取内置sdcard跟外置sdcard路径.(测试过两个手机,亲测可用) 1.先得到外置sdcard路径,这个接口是系统提供的标准接口. 2.得到上一级文件夹目录 3.得到该目录的所有文 ...

  3. 【前端攻略】最全面的水平垂直居中方案与flexbox布局

    最近又遇到许多垂直居中的问题,这是Css布局当中十分常见的一个问题,诸如定长定宽或不定长宽的各类容器的垂直居中,其实都有很多种解决方案.而且在Css3的flexbox出现之后,解决各类居中问题变得更加 ...

  4. Objective-C中的深拷贝和浅拷贝

    在Objective-C中对象之间的拷贝分为浅拷贝和深拷贝.说白了,对非容器类的浅拷贝就是拷贝对象的地址,对象里面存的内容仍然是一份,没有新的内存被分配.对非容器类的深拷贝就是重写分配一块内存,然后把 ...

  5. ELF动态链接

    为什么要使用动态链接? 在现代的linux系统中,假设一个普通的程序会使用到c语言静态库至少1MB以上,那么,如果我们的机器运行100个这样的程序,就用浪费近100MB的内存:如果磁盘有2000个这样 ...

  6. MySQL数据类型的验证

    CHAR char (M) M字符,长度是M*字符编码长度,M最大255. 验证如下: mysql)) default charset=utf8; ERROR (): ); use BLOB or T ...

  7. 坑爹的Maven

    之前没用过Maven,最近在研究Curator的时候,导入别人的工程,但是没有相应的包,需使用Maven解决依赖.于是各种折腾,最后虽然解决了,但中间的坑还不少.尽管网上也有相应的安装教程,但很多都是 ...

  8. [Keras] Install and environment setting

    Documentation: https://keras.io/ 1. 利用anaconda 管理python库是明智的选择. conda update conda conda update anac ...

  9. [C#]浅析ref、out参数

    转载:http://www.cnblogs.com/vd630/p/4601919.html#top 按引用传递的参数算是C#与很多其他语言相比的一大特色,想要深入理解这一概念应该说不是一件容易的事, ...

  10. 把《c++ primer》读薄(4-2 c和c++的数组 和 指针初探)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1.我们知道,将一个数组赋给另一个数组,就是将一个数组的元素逐个赋值给另一数组的对应元素,相应的,将一个vector 赋给另 ...