本文目录
- retrofit+rxjava怎样动态解析json数据
- retrofit2+MVP+rxjava2+rxlifecycle2 为什么无法解决内存泄露
- android 网络请求Retrofit+Rxjava报错
- rxjava和retrofit有什么好处
- rxjava和retrofit怎么多种的数据
- rxjava+retrofit 请求网络为什么抛出数组越界异常
- android 用rxjava和retrofit时怎么解决返回数据类型不一致
retrofit+rxjava怎样动态解析json数据
构建我们的model: (在这里我使用到了两个注解,这两个注解在XML中是不能使用的)class DataModel{@SerializedName(“code“) @Expose public String code;@SerializedName(“data“) @Expose public List《DataList》 dataList = new ArrayList《》();public static class DataList {@SerializedName(“ip“) @Expose public String ip= ““;@SerializedName(“country“) @Expose public String country= ““;
retrofit2+MVP+rxjava2+rxlifecycle2 为什么无法解决内存泄露
随着Android第三库的普及, RxJava 和 RxAndroid ( tiveX/RxAndroid )越来越被人熟知,简洁的语法,配合Java8 Lambda表达式,使代码的结构更加清晰,通过线程调度器更容易控制和切换线程,种种优点,使用它的人也越来越多。但是使用不好,很容易导致内存泄露。 Rxlifecycle (b.com/trello/RxLifecycle )就使被用来严格控制由于发布了一个订阅后,由于没有及时取消,导致Activity/Fragment无法销毁导致的内存泄露 。 RxJava和RxAndroidcompile ’io.reactivex:rxandroid:1.0.1’compile ’io.reactivex:rxjava:1.0.16’12Rxlifecyclecompile ’com.trello:rxlifecycle:0.3.0’compile ’com.trello:rxlifecycle-components:0.3.0’12Rxlifecycle 使用 Activity/Fragment需继承RxAppCompatActivity/RxFragment,目前支持的有RxAppCompatActivity、RxFragment、RxDialogFragment、RxFragmentActivity。一、bindToLifecycle()方法 在子类使用Observable中的compose操作符,调用,完成Observable发布的事件和当前的组件绑定,实现生命周期同步。从而实现当前组件生命周期结束时,自动取消对Observable订阅。Observable.interval(1, TimeUnit.SECONDS).compose(this.bindToLifecycle()).subscribe(new Action1《Long》() {@Overridepublic void call(Long num) {Log.i(TAG, “ “ +num);}});12345678二、bindUntilEvent() 方法 使用ActivityEvent类,其中的CREATE、START、 RESUME、PAUSE、STOP、 DESTROY分别对应生命周期内的方法。使用bindUntilEvent指定在哪个生命周期方法调用时取消订阅。Observable.interval(1, TimeUnit.SECONDS) .compose(this.bindUntilEvent(ActivityEvent.PAUSE)).subscribe(mSub);
android 网络请求Retrofit+Rxjava报错
检查项目依赖的retrofit和rxjava版本是否一致,大多数java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.都是由于这个问题造成的
2. compile ’com.squareup.retrofit2:adapter-rxjava:2.1.0’compile ’com.squareup.retrofit2:retrofit:2.1.0’
把版本调成一样的,重新gradle一下应该就阔以了
rxjava和retrofit有什么好处
其实操作符就是为了提供一些函数式的特性。函数式最大的好处就是处理数据简洁易懂。map就是相当于对每一个元素进行变换,返回变换后的集合filter就是对集合进行过滤each就是遍历集合take取出集合中的前几个skip跳过前几个元素unique相当于按照数学上的集合处理,去重其实我觉得题主觉得最难理解的应该是flatMap和Observable的概念吧。Observable可以理解成lazyload的集合。flatMap想当于对lazyLoad的集合中的每个元素再进行一次lazyload。如果题主接触过js,写过大量嵌套的回调,后面又尝试使用promise或者async库解决过这种嵌套异步回调的问题,理解RxJava就比较容易了。
rxjava和retrofit怎么多种的数据
首先定义带泛型的返回结果,Retrofit API 的原生结果映射为这种形式:
class Result《T》 {
String ResultMessage;
int ResultCode;
T Data;
}
2. 处理错误的方法和 @朱诗雄 前辈方法差不多,放到作为静态方法放到 RetroUtil 里,这里 ApiException 为自己定义的一个异常,放入错误码和错误信息(错误码不止一个):
static 《T》 Observable《T》 flatResult(Result《T》 result) {
return Observable.create(subscriber -》 {
switch (result.ResultCode) {
case Constants.SUCCESS_CODE:
subscriber.onNext(result.Data);
break;
case Constants.ERROR_CODE:
subscriber.onError(new ApiException(result.ResultCode, result.ResultMessage);
break;
default:
//
}
subscriber.onCompleted();
}
});
}
3. 在 API 包装类对于上述 Result《T》 格式的返回结果,统一调用 flatMap(RetroUtil::flatResult) 后的 API。这样每个 API 的返回结果就是 Observable《Data》 的形式并且在 errorHandler 中统一处理错误了。
// 接口方法
Observable《Result《User》》 getUserInfo();
// 包装后的方法
Observable《User》 getUserInfo() {
return mApi.getUserInfo.flatMap(RetroUtil::flatResult);
}
// 调用时
apiWrapper.getUserInfo()
.subscrible(user -》 {
// 处理正常逻辑
}, error -》 {
// 处理错误逻辑和异常,这里封装时通常也会统一处理,
// 提供一个默认的 Action1《Throwable》 参数,弹出
// throwable 的 message 打印日志等
});
rxjava+retrofit 请求网络为什么抛出数组越界异常
rxjava+retrofit 请求网络为什么抛出数组越界异常 主线程默认有Runloop。当自己启动一个线程,如果只是用于处理单一的事件,则该线程在执行完之后就退出了。所以当我们需要让该线程监听某项事务时,就得让线程一直不退出,runloop就是这么一个循环,没有事件的时候,一直卡着,有事件来临了,执行其对应的函数。 RunLoop,正如其名所示,是线程进入和被线程用来相应事件以及调用事件处理函数的地方.需要在代码中使用控制语句实现RunLoop的循环,也就是说,需要代码提供while或者for循环来驱动RunLoop.在这个循环中,使用一个runLoop对象执行接收消息,调用对应的处理函数.
android 用rxjava和retrofit时怎么解决返回数据类型不一致
1 这种方法有两大步第一步是拼接需要的json数据,第二步是用servlet的内置对象response返回到前台。 2 String 类型的数据可以不用借助任何工具直接返回,只要把它拼接对了就可以。如我需要返回一个{“success”:true,“msg”:“修改失败!”}的json,就可以如下图这样写。(注意,java里的引号要用的转义字符“\”) 3 如果需要返回的是一个list或者别的类的化,需要用到JSONArray的辅助工具类,然后使用response.getWriter().print(),返回到打到前台。具体代码如下图。 END 方法2:用Spring框架 如果你使用了Spring框架那就更简单了,你只需要在你的方法返回的时候加一个@ResponseBody的注解就可以了。就这么简单。