从我最开始用rx和retrofit.到如今,快3年了.android
这个库的内容,算是沉淀下来的东西.git
我的用这个作过的项目也有不少个了.和项目中用的有点区别.github
由于不能随便重构的缘由,比项目里的更好.哈哈.json
NetWorkManager.init(String baseUrl, Application context)
复制代码
做为一个库,这个类是一个头疼的问题.由于强耦合.api
咱们通常写的baseBaen都是这样的:缓存
class BaseBean<T>{
String code;
T data;
String msg;
}
复制代码
不一样的人,有不一样的协议,字段名会不同,若是用这样的,明显是不行的.bash
你只须要定义本身的basebean规则,便可服务器
NetWorkManager.addParseInfo(
new RxParseInfo("code", "data", "msg", "200") //200表明成功时的code.
);
复制代码
这里传入的参数都是key的名字.网络
目前支持3个key值.我以为基本够用了.app
codeKey
判断成功
dataKey
返回数据
msgKey
服务器返回消息
ParseInfo 里默认经过判断successCode
与返回的codeKey
的值进行比较的
public boolean isSuccess(JsonObject asJsonObject) {
if (checkSuccess != null) {
return checkSuccess.isSuccess(asJsonObject);
}
String code = asJsonObject.get(codeKey).toString();
return TextUtils.equals(code, successCode);
}
复制代码
ParseInfo使用setCheckSuccess().非必须.主要是为了扩展.
new ParseInfo("code", "data", "msg", "200")
.setCheckSuccess(new ParseInfo.CheckSuccess() {
@Override
public boolean isSuccess(JsonObject asJsonObject) {
return false;
}
})
复制代码
public interface JApi {
/**
* 上传文件
*/
@POST
@Multipart
Observable<String> post(@Url String url, @PartMap HashMap<String, RequestBody> params);
/**
* 通用POST
*
*/
@POST
Observable<String> post(@Url String url, @Body String json);
/**
* 通用POST
*/
@POST
Observable<String> post(@Url String url, @Body SimpleParams json);
/**
* 通用get
*/
@GET
Observable<String> get(@Url String url, @QueryMap SimpleParams params);
}
复制代码
这里写了4个通用的retrofit的请求.我我的以为是能够知足大部分的需求了.
若是知足不了.就写点定制的就行了.有人会以为这么写不行,实际上,我就用这个已经写了不少项目了.
有人会问,为何这里都是Observable<String>
,日后面看就知道了.嘿嘿
这里使用了饿汉式懒加载单例.
public class RetrofitUtil {
/**
* 服务器地址
*/
private static String API_HOST;
private static Application mContext;
private static final HashMap<Class, Object> apis = new HashMap<>();
@SuppressWarnings("unchecked")
public static <T> T getApi(Class<T> c) {
Object o = apis.get(c);
if (null == o) {
o = getInstance().create(c);
apis.put(c, o);
}
return (T) o;
}
public static synchronized void init(String baseUrl, Application context) {
if (TextUtils.isEmpty(baseUrl)) {
return;
}
mContext = context;
API_HOST = baseUrl;
Instance.retrofit = Instance.getRetrofit();
apis.clear();
}
public static Retrofit getInstance() {
return Instance.retrofit;
}
private static class Instance {
private static Retrofit retrofit = getRetrofit();
private static Retrofit getRetrofit() {
OkHttpClient.Builder client = new OkHttpClient.Builder()
//拦截并设置缓存
.addNetworkInterceptor(new CacheInterceptor())
//拦截并设置缓存
.addInterceptor(new CacheInterceptor())
.cache(new Cache(mContext.getCacheDir(), 10240 * 1024));
// 设置代理
if (NetWorkManager.getProxy() != null) {
client.proxy(NetWorkManager.getProxy());
}
for (Interceptor i : NetWorkManager.mInterceptors) {
client.addInterceptor(i);
}
if (BuildConfig.DEBUG) {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
client.addInterceptor(interceptor);
}
return new Retrofit.Builder()
.client(client.build())
.baseUrl(API_HOST)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
}
}
复制代码
能够设置缓存,添加代理,重置baseurl
对Retrofit.create建立的实体类,进行了缓存.
Disposable login = RetrofitUtil.getApi(JApi.class)
.get("/login", SimpleParams.create()
.putP("key1", 1)
.putP("key2", 2)
.putP("key3", 2)
.putP("key4", 3)
)
.compose(JRxCompose.normal())
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
}
});
复制代码
一个简单的请求就是这样的.
有人看了会问, JRxCompose
是啥?
先来张目录图
再来张代码
这里为何要写JsonArrayParesTransformer
和JsonParesTransformer
.
由于在组件化的时候,跨组件GSON解析时,泛型是会丢失的.我不知道如今解决没.
因此使用这两个来统一解析结果.
若是你细心就会发现.JApi
的方法,的返回参数都是Observable<String>
也就是统一先用String接收结果,而后再解析成最终结果.
看到这里,你知足了吗? 我是不知足的.哈哈
如何舒服的取消请求回调一直是个头疼的问题
不取消就会内存泄露,调用已关闭的activity,形成崩溃.
固然,如今有RxLifecyle
之类的库,很方便.
这里我简单实现了一个.不过有版本限制.依赖Android自带的Lifecycle
public class JApiImpl implements JApi, LifecycleObserver, ObservableTransformer<String, String> {
public static JApi getApi() {
return RetrofitUtil.getApi(JApi.class);
}
public static JApiImpl with(Lifecycle lifecycle) {
JApiImpl JApiImpl = new JApiImpl();
lifecycle.addObserver(JApiImpl);
return JApiImpl;
}
public static JApiImpl with(Fragment fragment) {
return with(fragment.getLifecycle());
}
public static JApiImpl with(AppCompatActivity activity) {
return with(activity.getLifecycle());
}
private Disposable disposable;
@Override
public ObservableSource<String> apply(Observable<String> upstream) {
return upstream.doOnSubscribe(disposable -> this.disposable = disposable);
}
private void cancel() {
if (this.disposable != null && !disposable.isDisposed()) {
disposable.dispose();
}
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy() {
this.cancel();
Log.i("233", "取消了请求");
}
@Override
public Observable<String> post(String url, HashMap<String, RequestBody> params) {
return getApi().post(url, params).compose(this);
}
@Override
public Observable<String> post(String url, String json) {
return getApi().post(url, json).compose(this);
}
@Override
public Observable<String> post(String url, SimpleParams params) {
return getApi().post(url, params).compose(this);
}
@Override
public Observable<String> get(String url, SimpleParams params) {
return getApi().post(url, params).compose(this);
}
}
复制代码
实现了JApi
,LifecycleObserver
,ObservableTransformer
LifecycleObserver
是为了利用如今android自带的Lifecycle实现取消回调
ObservableTransformer
是为了转换Observer.拿到Disposable.
JApiImpl.with(this)
.get("/login", SimpleParams.create()
.putP("key1", 1)
.putP("key2", 2)
.putP("key3", 2)
.putP("key4", 3)
)
.compose(JRxCompose.normal())
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
}
});
复制代码
NetWorkManager.setApiCallBack(new APICallBack() {
@Override
public String callback(String code, String resultData) {
JsonElement jsonElement = JSONFactory.parseJson(resultData);
return JSONFactory.getValue(jsonElement, "message");
}
});
复制代码
NetWorkManager.initKey("私钥", "公钥");//加密解密
复制代码
NetWorkManager.setDefaultTimeOut(20);//秒
复制代码
NetWorkManager.setDefaultRetry(5);//重试次数
复制代码
//结果是一个Object
JApiImpl.with(this)
.post("/Login", SimpleParams.create())
.compose(JRxCompose.obj(Login.class))
.subscribe(new Consumer<Login>() {
@Override
public void accept(Login login) throws Exception {
}
});
//结果是集合
JApiImpl.with(this)
.post("/Login", SimpleParams.create())
.compose(JRxCompose.array(Login.class))
.subscribe(new Consumer<List<Login>>() {
@Override
public void accept(List<Login> logins) throws Exception {
}
});
复制代码
这里支持传入CompositeDisposable
,添加当前的Disposable
,用于取消回调,若是你用了上面的 JApiImpl
,那么这里能够不传CompositeDisposable
,这个是我最先实现统一取消回调的逻辑.
/**
* @author jlanglang 2016/11/14 17:32
* @版本 2.0
* @Change
*/
public abstract class SimpleObserver<T> implements Observer<T> {
protected Disposable mDisposable;
private CompositeDisposable mCompositeDisposable;
public SimpleObserver() {
this(null);
}
public SimpleObserver(CompositeDisposable compositeDisposable) {
mCompositeDisposable = compositeDisposable;
}
@Override
public void onSubscribe(@NonNull Disposable d) {
mDisposable = d;
try {
mCompositeDisposable.add(d);
} catch (Exception ignored) {
}
}
@Override
public void onNext(T t) {
call(t);
}
@Override
public void onError(Throwable e) {
JErrorEnum.normal(e);
}
@Override
public void onComplete() {
}
public abstract void call(@NonNull T t);
}
复制代码
String errorMsg = null;
//经过code获取注册的接口回调.
APICallBack apiCallback = NetWorkManager.getApiCallback();
if (apiCallback != null) {
String callbackMsg = apiCallback.callback(code, response);
if (!TextUtils.isEmpty(callbackMsg)) {
errorMsg = callbackMsg;
}
}
//若是callback不处理,则抛出服务器返回msg信息
if (TextUtils.isEmpty(errorMsg)) {
errorMsg = msg;
}
//抛出异常,走到onError.
throw new APIException(code, errorMsg);
复制代码
这里写了一个枚举.用来处理异常消息.
public enum JErrorEnum implements Consumer<Throwable> {
normal(0), toast(1);
private int type;
JErrorEnum(int type) {
this.type = type;
}
public static void normal(Throwable throwable) {
normal.accept(throwable);
}
public static void toast(Throwable throwable) {
toast.accept(throwable);
}
@Override
public void accept(Throwable throwable) {
String errMsg = "";
Class<? extends Throwable> throwableClass = throwable.getClass();
//处理Api自定义异常处理,请求是成功的,若是须要特殊处理,使用APICallBack
if (throwableClass.equals(APIException.class)) {
errMsg = throwable.getMessage();
}
//处理error异常,http异常
onExceptionListener exceptionListener = NetWorkManager.getExceptionListener();
if (exceptionListener != null) {
errMsg = exceptionListener.onError(throwable);
}
if (type == 1 && !TextUtils.isEmpty(errMsg)) {
Toast.makeText(NetWorkManager.getContext(), errMsg, Toast.LENGTH_SHORT).show();
}
}
}
复制代码
normal
默认只处理异常逻辑,不会弹消息
@Override
public void onError(Throwable e) {
JErrorEnum.normal(e);
}
复制代码
toast
会弹消息
@Override
public void onError(Throwable e) {
JErrorEnum.toast(e);
}
复制代码
Disposable subscribe = JApiImpl.with(this)
.get("", SimpleParams.create())
.compose(JRxCompose.obj(Login.class))
.subscribe(login1 -> {
}, JErrorEnum.toast);
复制代码
若是不使用JErrorEnum
的话.下面的设置就会失效,注意一个请求内不要重复使用哈.
NetWorkManager.setExceptionListener(new onExceptionListener() {
@Override
public String onError(Throwable throwable) {
return null;
}
});
复制代码
大体使用就这些了.
库里还包含了rxbus.
欢迎你们点赞,留言提建议
github地址: JRxRetrofit
Flutter:782978118
Android:493180098