lygttpod / rxhttputils Goto Github PK
View Code? Open in Web Editor NEWRxjava+Retrofit封装,便捷使用
Rxjava+Retrofit封装,便捷使用
很喜欢作者的这个网络工具库,因为习惯了okhttp的调用风格,希望作者可以考虑加入okhttp调用风格,偶然间发现名叫Novate的库有类似实现。很希望RxHttpUtils也可以这样使用,一点建议。最后,感谢大神的库,提高了我们的工作效率
对于多个baseUrl是如何支持的 ?
版本号:2.1.7
描述:使用RxHttp时,调用RxHttpUtils.canceAll(),也就是取消全部请求时,APP崩溃了,直接错误是 java.util.ConcurrentModificationException,日志定位到RxHttpManager.java这个文件的第97行,
可能原因:
@OverRide
public void cancelAll() {
if (mMaps.isEmpty()) {
return;
}
Iterator<Map.Entry<Object, CompositeDisposable>> it = mMaps.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<Object, CompositeDisposable> entry = it.next();
Object tag = entry.getKey();
cancel(tag);
}
}
迭代HashMap()时,同时调用了cancel()这个方法,而这个方法里面有调用了HashMap的remove方法,导致ConcurrentModificationException。
好像没有看到多文件的上传,多图片上传,文件和文字共同上传
如题
#31 我按照大神这里头指导的设置了到了本地 存文件的方式
我的需求也是 登录之后 服务器会给返回token的值,通过json给我返回 然后我保存到了SP文件中, 我的请求头的键为 access-token,值就是服务器返回的, 我在全局APPlication设置了 但是不知道此时的值该怎么设置··· 我测试通过登录后返回了token 然后保存到了SP中,可是当我请求另外一个接口的时候 access-token就没有传递···
<-- 504 Unsatisfiable Request (only-if-cached)
1.可否自定义缓存,因为自带你的缓存,必须是get请求而且还需要服务器配合头文件返回处理
2.可否用:Rxlifecycle取消请求
有无统一回调处理的?比如后台返回code-1的话就跳到登录界面,这样,不必每个接口都处理。
您好,打扰了,无意中看到您的库,粗略的学习了下您的代码,发现您的框架可以使用两种模式进行网络请求
第一种模式持有全局唯一的 Retrofit.Builder 对象和 OkHttpClient.Builder 对象,每次网络请求都调用一次 build() 方法生成新的 Retrofit 对象 和 OkHttpClient 对象,再调用 create() 生成新的 APIService 对象进行网络请求
第二种模式,每次网络请求都 New 一个 Retrofit.Builder 对象和 OkHttpClient.Builder 对象,进行 Retrofit 和 OkHttpClient 的参数配置后再分别调用一次 build() 方法生成新的 Retrofit 对象 和 OkHttpClient 对象,再调用 create() 生成新的 APIService 对象进行网络请求
可以看到两种模式在每次请求中都会重新生成新的 Retrofit 对象和 OkHttpClient 对象,意味一个使用您这个库的 App 为了请求数据会无限制的重复生成新的 Retrofit 对象和 OkHttpClient 对象
而且这些 Retrofit 对象和 OkHttpClient 对象大多数情况配置可能都是一样的,需要使用到多个 Retrofit 的场景, 大多都是需要多 BaseUrl 进行不同域名请求的情况,但是可以通过 RetrofitUrlManager 重复使用同一个 Retrofit 就可以解决
在我的项目中调用 create() 生成的 APIService 都是全局唯一的,重复请求只会使用同一个 APIService,所以我不明白您为什么需要每次请求网络都需要新建这些对象,App 在进行高频率的网络请求时会出现性能上的损耗吗, 这样做,还是有什么其他的考虑?
有缓存会走onSuccess方法,但是如果需求是,
1.先取缓存,无论如何都去取网络的,您这个框架怎么做!
2.先取缓存,缓存没数据,再去网络的,您这个框架怎么做!
小白一个,可否讲个思路
demo中因为只有一个activity,所以直接在请求接口后,在ondestory中调用cancelAllRequest方法,解除订阅,但是如果有多个activity,用的都是默认的在APP.java中的配置,又因为你的默认的RxHttpUtil是单例模式,用的是同一个private static List disposables; 这个list,这时候比如关闭了其中一个activity,你就没法直接调用cancelAllRequest了。因为就会把存在的其他的activity里面的订阅也给取消。
PS:不需要使用List这种,还要去遍历一个个取消,有现成的CompositeDisposable,添加进去一个个Disposable后,对CompositeDisposable取消订阅就可以。
library的清单文件里面android:allowBackup="true" 导入的时候无法合并(我在本地禁用了备份功能) 能把这个属性从manifest里面删除吗
SingleRxHttp对每个请求单独配置参数存在线程安全问题,因为该对象获取的方式为单例获取,所有获取到的该对象,线程之间还是会共享数据(baseUrl等),一个线程配置改变会影响其他线程的参数。
楼主 为什么我用了DataObserver 总是报解析错误,
RxHttpUtils.createApi(ApiService.class)
.geBannerData()
.compose(Transformer.<BaseData>switchSchedulers())
.subscribe(new DataObserver() {
@OverRide
protected void onError(String errorMsg) {
}
@Override
protected void onSuccess(BannerBean data) {
String a = data.getData().get(0).getImg();
}
});
返回的json:
/**
* status : success
* message :
* data : [{"img":"http://orr4xduaa.bkt.clouddn.com/5a5daf4fa7196.jpg","link":""},{"img":"http://orr4xduaa.bkt.clouddn.com/5a5daf0b41d90.png","link":""}]
* code : 200
* token : 53egcib14n0i3vngmr7nd0vvt7
*/
bean:
private List data;
public List<DataBean> getData() {
return data;
}
public void setData(List<DataBean> data) {
this.data = data;
}
public static class DataBean {
/**
* img : http://orr4xduaa.bkt.clouddn.com/5a5daf4fa7196.jpg
* link :
*/
private String img;
private String link;
为什么demo里SuperTextView设置android:layout_width="wrap_content"无效,如果是写具体dp值还是有效的
如果是的话如何去除?因为弹出信息为中文,APP是用的英文,所以会很违和
如果统一设置了headers ,如何 更新某个子元素
1、我在GET这个接口(http://www.qingniantuzhai.com/api/posts/3067?comments=3) 的时候给我重定向到另外一个网址去了,但是在浏览器请求就完全ok
2、处理一些loading框或者其他的loading方式的时候能否暴露接口便于去扩展。
3、貌似没有发现自动取消请求的操作!
你这个 compile 'com.github.lygttpod:RxHttpUtils:2.0.4' 是替代类库的libray的吗?为何一直下载不下来。编译通过不了。
String destFileDir 使用可配置参数,不要使用默认的根目录
如题,或者有什么替代的方法?
你好大神,询问缓存的问题,是否支持post 的缓存
请问在请求数据的时候我这边返回的是一个list数组,但是数据为空的时候返回的是
{"error":"0","data":null}
定义的调用接口是
Observable<List> getLive(@query("params") int id);
这样的话数据为空的话就会报错
onError: errorMsg Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
请问有什么办法处理这种情况吗
第二个:单个请求
在断网的时候,会报空指针异常,而不是没网络
把:.saveCookie(true),改成false就不会
正在学习这方面的东西,希望长传功能早点出来
这个方法:是取消所有请求,可能存在你快速点击去下个界面,上一个界面还在请求。这个时候你从下一个界面返回上一个界面的话,上一个界面请求就会被取消,这样体验不好。请问有没有只取消当前activity界面的请求的方法。
@OverRide
protected void onDestroy() {
super.onDestroy();
//取消所有请求
RxHttpUtils.cancelAllRequest();
}
发现 compile 'com.github.lygttpod:SuperTextView:2.1.2' 版本库的一个小bug, stv:sRightIconRes="" 图片可预览,真机运行无法显示,望作者检查一下,版本改成2.1.1后没问题。
大神晚上好,我们的需求需要把缓存的60秒改为10秒,拜读了大神的代码,没有找到可以修改的函数。于是copy了一份OkHttpConfig,又copy了一份NetCacheInterceptor,把默认的60秒改为10秒,Copy的OkHttpConfig中使用新的NetCacheInterceptor进行拦截,然后按照原来的OkHttpConfig的使用方式来使用,经测试,发现拦截器全都不好使了,想咨询一下大神,我的问题大概出在哪里?是否有更加简单的修改默认60秒的方法。期待大神回复,感谢大神提供的工具,真的很方便
3、DataObserver (适合{"code":200,"msg":"描述",data:{}}这样的格式,需要使用BaseData ,其中T为data中的数据模型)
第三种方式没有用
库开发者您好,在使用
/**
* 上传单张图片
*
* @param uploadUrl 地址
* @param uploadPath 文件路径
*/
private void uploadImg(String uploadUrl, String uploadPath) {
RxHttpUtils.uploadImg(uploadUrl, uploadPath)
.compose(Transformer.<ResponseBody>switchSchedulers(loading_dialog))
.subscribe(new CommonObserver<ResponseBody>() {
@Override
protected String setTag() {
return "uploadImg";
}
@Override
protected void onError(String errorMsg) {
Log.e("allen", "上传失败: " + errorMsg);
showToast(errorMsg);
}
@Override
protected void onSuccess(ResponseBody responseBody) {
try {
String msg = responseBody.string();
showToast(msg);
Log.e("allen", "上传完毕: " + msg);
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
的时候发现之前定义好的header中的参数没有传递给服务端。其它的接口请求是正常传递header参数的。
请问这种情况下应该怎么处理呢?
目前不管是否设置了cache缓存,第一句一定会去执行,然后就有可能报空指针异常。
private void setCacheConfig() {
OkHttpConfig.defaultCachePath = this.context.getExternalCacheDir().getPath() + "/RxHttpCacheData";
if (this.isCache) {
Cache cache;
if (!TextUtils.isEmpty(this.cachePath) && this.cacheMaxSize > 0L) {
cache = new Cache(new File(this.cachePath), this.cacheMaxSize);
} else {
cache = new Cache(new File(OkHttpConfig.defaultCachePath), 104857600L);
}
OkHttpConfig.okHttpClientBuilder.cache(cache).addInterceptor(new NoNetCacheInterceptor()).addNetworkInterceptor(new NetCacheInterceptor());
}
}
里面的第一句,如果设备获取getExternalCacheDir是null,那么后面还会执行getpath,然后就报空指针异常了。
比如我的Activity要发起 5 次接口请求,而且是没有关联的请求, 我同时发起,然后回调回来(我的请求是在Model层发起的,Activity只管处理回调方法)
Model层发起请求 1
RxHttpUtils
.createApi(API.class)
.getData(pn,ps,type)
.compose(Transformer.<Rtn>switchSchedulers(DialogUtil.showLoading(context)))
.subscribe(new CommonObserver<Rtn>() {
@Override
protected void onError(String errorMsg) {
onResponseFailed(null,errorMsg);
}
@Override
protected void onSuccess(Rtn bookBean) {
onResponseSuccess(code,bookBean); //这里是Activity 复写的回调方法
}
});
**Model层发起请求 2*·
RxHttpUtils
.createApi(API.class)
.getData(pn,ps,type)
.compose(Transformer.<Rtn>switchSchedulers(DialogUtil.showLoading(context)))
.subscribe(new CommonObserver<Rtn>() {
@Override
protected void onError(String errorMsg) {
onResponseFailed(null,errorMsg);
}
@Override
protected void onSuccess(Rtn bookBean) {
onResponseSuccess(code,bookBean); //这里是Activity 复写的回调方法
}
});
**Model层发起请求 3**
RxHttpUtils
.createApi(API.class)
.getData(pn,ps,type)
.compose(Transformer.<Rtn>switchSchedulers(DialogUtil.showLoading(context)))
.subscribe(new CommonObserver<Rtn>() {
@Override
protected void onError(String errorMsg) {
onResponseFailed(null,errorMsg);
}
@Override
protected void onSuccess(Rtn bookBean) {
onResponseSuccess(code,bookBean); //这里是Activity 复写的回调方法
}
});
这里的R小HttpUtils中的onSuccess 中写了个onResponseSuccess() 方法, 我咋我的Activity中复写这个方法 就可以接受回调回来的数据, 那么此时 我该怎么区分 是哪个接口回来的请求呢?
断网后的使用GlobalRxHttp方式请求,无法获取错误信息
@Override
public void onError(@NonNull Throwable e) {
String error = ApiException.handleException(e).getMessage();
setError(error);
}
这里的error 取出来的数据是”“ 空字符串。
希望可以添加上信息提示
报错
java.io.IOException: unexpected end of stream on Connection{192.168.24.100:9041, proxy=DIRECT@ hostAddress=/192.168.24.100:9041 cipherSuite=none protocol=http/1.1}
不知道是什么原因
项目中需要将 token 设置在 header 中,未登录之前 token 是空的,登录之后会获取到服务器返回的token 值。请问在 Application 中初始化了 Rxhttp,设置了全局 headers,在登录后如何动态更新全局 header 的值呢?
public void initRxHttp() {
HashMap<String, Object> headers = new HashMap<>();
headers.put("token", "SPUtil.getString("token)");
OkHttpClient okHttpClient = new OkHttpConfig
.Builder()
//全局的请求头信息
.setHeaders(headers)
.build();
RxHttpUtils
.getInstance()
.init(this)
.config()
//配置全局baseUrl
.setBaseUrl(Constant.baseUrl)
//开启全局配置
.setOkClient(okHttpClient);
}
RxHttpUtils
//单个请求的实例getSInstance(getSingleInstance的缩写)
.getSInstance()
....(中间省略设置)
.cache(true)
//单个请求的缓存路径及缓存大小,不设置的话有默认值
.cachePath("cachePath", 1024 * 1024 * 100)
如果这样设置单个请求的话,断网的时候Toa:“”会报空指针异常“”,而不是网络连接异常。
public RetrofitClient() {
this.initDefaultOkHttpClient();
this.mRetrofitBuilder = (new Builder()).addCallAdapterFactory(RxJava2CallAdapterFactory.create()).addConverterFactory(ScalarsConverterFactory.create()).addConverterFactory(GsonConverterFactory.create(GsonAdapter.buildGson()));
}
我看你的addCallAdapterFactory和addConverterFactory都是写死的,处于什么原因不允许自己配置吗?如果有些需求需要统一对返回结果做处理,本来改个factory就行。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.