- 浏览: 676324 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
qinshubao152:
参考:http://www.see-source.com/bl ...
关于android USB Host 串口编程 -
q328965539:
哥们 我做的数据也都是错误的啊····我怎么可以知道自己otg ...
关于android USB Host 串口编程 -
hgkmail:
好文
android中跨进程通讯的4种方式 -
cczscq:
楼主,我这里有个问题!我这里有个自己制作的font.ttf,这 ...
android字体的工作原理 -
blueice1986:
既然springMVC比struts好那么多的话那struts ...
为什么有了Struts 还要Spring MVC
内存泄露处理
基本代码:
private final CompositeDisposable disposables = new CompositeDisposable();
public void doSomeWork2() {
// 1. 创建一个普通的 observable
Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
if (e.isDisposed()) return;
SystemClock.sleep(2000);
e.onNext("next");
e.onComplete();
}
});
// 2. 创建一个可被 CompositeDisposable 管理的 observer
DisposableObserver<String> observer = new DisposableObserver<String>() {
@Override
public void onNext(String value) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
};
// 3. 订阅事件
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
// 4. 将需要被 CompositeDisposable 管理的 observer 加入到管理集合中
disposables.add(observer);
}
在 Activity/Fragment 销毁生命周期中取消异步操作防止内存泄露:
@Override
protected void onDestroy() {
super.onDestroy();
// 将所有的 observer 取消订阅
disposables.clear();
}
在 mvp 的项目中处理内存泄露
基于 google todo-mvp-rxjava 搭建项目 mvp 框架:
BasePresenter :
public abstract class BasePresenter {
CompositeDisposable mCompositeDisposable = new CompositeDisposable();
public void unSubscribe() {
mCompositeDisposable.clear();
}
public void register(Disposable disposable) {
mCompositeDisposable.add(disposable);
}
}
一个例子 SimplePresenter extends BasePresenter :
public class SimplePresenter extends BasePresenter {
private static final String TAG = SimplePresenter.class.getSimpleName();
//...构造方法..
public void startWork() {
DisposableObserver<Long> observer = new DisposableObserver<Long>() {
@Override
public void onNext(Long value) {
Log.d(TAG, "onNext: ");
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
};
Observable.interval(2000, TimeUnit.MILLISECONDS)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
register(observer);
}
}
注意:在使用 RxJava 做异步操作的时候,调用 register(observer); 注册 observer 到 CompositeDisposable 中统一管理。
Activity/Fragment:
@Override
protected void onDestroy() {
super.onDestroy();
mSimplePresenter.unSubscribe();
}
慎用 functions
functions:Action,Consumer,Function 等
原因:这些方法只会对 onNext 事件进行处理,如果 observable 中出现异常产生了 onError 事件就会导致 app 奔溃。
解决方案:
不用简化方法
自己封装一个:
封装一个类似下面的基类:
public abstract class BaseDisposableObserver<T> extends DisposableObserver<T> {
private static final String TAG = BaseDisposableObserver.class.getSimpleName();
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError: " + e.getMessage());
}
@Override
public void onComplete() {
}
}
使用的时候和 functions 是一样的:(这样下面的代码就不会导致app奔溃了)
BaseDisposableObserver<Long> baseDisposableObserver = new BaseDisposableObserver<Long>() {
@Override
public void onNext(Long value) {
Log.d(TAG, "onNext: ");
}
};
Observable.interval(2000, TimeUnit.MILLISECONDS)
.filter(new Predicate<Long>() {
@Override
public boolean test(Long aLong) throws Exception {
Log.d(TAG, "test: along:" + aLong);
if (aLong > 2) {
throw new Exception("sdf");
}
return true;
}
})
// .subscribeOn(Schedulers.io())
// .observeOn(AndroidSchedulers.mainThread())
.subscribe(baseDisposableObserver);
RxJava 看的还不多,如有错误还请指出
作者:Passon_Fang
链接:https://www.jianshu.com/p/b672724dbff8
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
基本代码:
private final CompositeDisposable disposables = new CompositeDisposable();
public void doSomeWork2() {
// 1. 创建一个普通的 observable
Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
if (e.isDisposed()) return;
SystemClock.sleep(2000);
e.onNext("next");
e.onComplete();
}
});
// 2. 创建一个可被 CompositeDisposable 管理的 observer
DisposableObserver<String> observer = new DisposableObserver<String>() {
@Override
public void onNext(String value) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
};
// 3. 订阅事件
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
// 4. 将需要被 CompositeDisposable 管理的 observer 加入到管理集合中
disposables.add(observer);
}
在 Activity/Fragment 销毁生命周期中取消异步操作防止内存泄露:
@Override
protected void onDestroy() {
super.onDestroy();
// 将所有的 observer 取消订阅
disposables.clear();
}
在 mvp 的项目中处理内存泄露
基于 google todo-mvp-rxjava 搭建项目 mvp 框架:
BasePresenter :
public abstract class BasePresenter {
CompositeDisposable mCompositeDisposable = new CompositeDisposable();
public void unSubscribe() {
mCompositeDisposable.clear();
}
public void register(Disposable disposable) {
mCompositeDisposable.add(disposable);
}
}
一个例子 SimplePresenter extends BasePresenter :
public class SimplePresenter extends BasePresenter {
private static final String TAG = SimplePresenter.class.getSimpleName();
//...构造方法..
public void startWork() {
DisposableObserver<Long> observer = new DisposableObserver<Long>() {
@Override
public void onNext(Long value) {
Log.d(TAG, "onNext: ");
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
};
Observable.interval(2000, TimeUnit.MILLISECONDS)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
register(observer);
}
}
注意:在使用 RxJava 做异步操作的时候,调用 register(observer); 注册 observer 到 CompositeDisposable 中统一管理。
Activity/Fragment:
@Override
protected void onDestroy() {
super.onDestroy();
mSimplePresenter.unSubscribe();
}
慎用 functions
functions:Action,Consumer,Function 等
原因:这些方法只会对 onNext 事件进行处理,如果 observable 中出现异常产生了 onError 事件就会导致 app 奔溃。
解决方案:
不用简化方法
自己封装一个:
封装一个类似下面的基类:
public abstract class BaseDisposableObserver<T> extends DisposableObserver<T> {
private static final String TAG = BaseDisposableObserver.class.getSimpleName();
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError: " + e.getMessage());
}
@Override
public void onComplete() {
}
}
使用的时候和 functions 是一样的:(这样下面的代码就不会导致app奔溃了)
BaseDisposableObserver<Long> baseDisposableObserver = new BaseDisposableObserver<Long>() {
@Override
public void onNext(Long value) {
Log.d(TAG, "onNext: ");
}
};
Observable.interval(2000, TimeUnit.MILLISECONDS)
.filter(new Predicate<Long>() {
@Override
public boolean test(Long aLong) throws Exception {
Log.d(TAG, "test: along:" + aLong);
if (aLong > 2) {
throw new Exception("sdf");
}
return true;
}
})
// .subscribeOn(Schedulers.io())
// .observeOn(AndroidSchedulers.mainThread())
.subscribe(baseDisposableObserver);
RxJava 看的还不多,如有错误还请指出
作者:Passon_Fang
链接:https://www.jianshu.com/p/b672724dbff8
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
发表评论
-
AndroidStudio无法执行Java的main函数
2021-03-25 10:10 730FAILURE: Build failed with an e ... -
最近github经常打不开解决办法
2021-03-23 21:43 2https://zhuanlan.zhihu.com/p/15 ... -
android studio 各个历史版本下载
2021-03-15 16:51 1622android studio 各个历史版本下载 https: ... -
pod install 的历程
2021-01-27 09:34 366公司ios项目拉下来执行有报错,建议执行pod install ... -
Android Studio Database Inspector 使用
2021-01-22 15:24 553转:https://segmentfault.com/a/ ... -
kotlin学习
2021-01-05 10:26 325转 https://blog.csdn.net/github_ ... -
Flutter upgrade升级一直停留在 Running pub upgrade...
2020-10-26 10:15 1060win10 下配置 最后用国内镜像解决了。方法: 1、计算机 ... -
什么是MVVM模式的架构?
2020-10-20 12:14 487转自:https://www.jianshu.com/p/a8 ... -
原生开发、H5开发和混合开发的优缺点
2020-06-04 15:20 515目前市场上主流的APP分为三种:原生APP、Web APP( ... -
flutter填坑——解决ListView添加在Scaffold上默认的的top-padding
2020-01-11 15:09 613解决方法 把ListView用MediaQuery.remo ... -
Flutter开发环境搭建——Ubuntu
2019-09-02 18:10 447配置完做下记录 准备,加快下载速度 由于在国内访问Flutt ... -
原 android view相对于根布局的坐标获取
2019-05-10 11:09 923一张图就看懂了,附件 -
认识一下 Emoji
2019-03-26 15:07 638https://www.cnblogs.com/plokmju ... -
ubuntu批量修改文件名字(换动画资源必用)
2019-03-23 15:28 829for file_old in `ls | grep 原来的 ... -
ubuntu连接android设备(附最简单方法)
2019-03-14 10:35 903新买的手机IQOO后,连不上adb,显示数字加null,所以看 ... -
解决 Configure build 下载慢的问题(亲测有效)
2019-03-09 23:11 3103在build.gradle 文件加入下面代码即可 buil ... -
记录下ubuntu下studio安装flutter
2019-03-09 11:37 1290一、安装Flutter的SDK及环境配置 1、访问官网,下载S ... -
Flutter与React Native
2019-03-06 17:58 946Flutter 与React Native 对比 [关于性 ... -
论开发框架的选择MVP,RxFlux2,Rxjava,Dagger2或在不需要
2018-08-31 10:23 989为什么要使用框架 使用框架,是为了提高生产效率。 框架就是 ... -
不继承RxAppCompatActivity的情况下使用RxLifeCycle
2018-08-29 10:07 2061在Android中使用Rxjava时可能会在页面退出时出现内存 ...
相关推荐
在Android开发中,RxJava是一个广泛使用的异步编程库,它允许开发者以声明式的方式处理事件和数据流。然而,不正确的使用往往会导致内存泄漏,影响应用性能和用户体验。本篇将详细介绍如何通过一个轻量级的RxJava...
RxJava2是一个响应式编程库,它将异步操作转化为一系列数据流(或事件),通过观察者模式进行处理。响应式编程允许开发者以声明式的方式处理数据流,这使得代码更易于理解和维护。RxJava2引入了Backpressure机制,...
2. **在Android中的应用**:如何在Activity或Fragment中使用RxJava处理异步任务,如何在生命周期方法中管理订阅,以防止内存泄漏。 3. **与Realm结合**:如何利用RxJava2的特性来实现 Realm 数据的实时监听和更新,...
- **Disposable**:用于取消订阅,避免内存泄漏等问题。 #### 2.3 Operators - **创建操作符**:如`just()`、`fromIterable()`等,用于创建Observable。 - **转换操作符**:如`map()`、`flatMap()`等,用于转换数据...
通过"RxJava2学习demo",你可以看到如何实际应用这些概念,创建复杂的异步流程,并了解如何优化性能和避免内存泄漏。实践中,你可以尝试构建不同的数据管道,结合各种操作符,以掌握RxJava2的强大功能。不断积累这些...
RxJava2.x 是一个在Android开发中广泛使用的异步编程库,它引入了反应式编程的概念,使得处理事件和数据流变得更加简洁、高效。在这个"rxjava2demo.zip"压缩包中,包含了一个详细的Android RxJava2.x 示例项目,帮助...
RXJava2是一个强大的异步处理库,被广泛应用于Android开发中。它引入了一种响应式编程的模式,能够简化复杂的事件处理和数据流管理。在这个"RXjava2 demo"中,我们可以通过运行示例来深入理解RXJava2的核心概念和...
RxJava2提供了一些生命周期相关的操作符,如`takeUntil()`、`takeWhile()`,用于在特定条件满足时结束数据流,避免内存泄漏。 **背压策略** 在高频率数据流和低处理速度之间,可能出现背压问题。RxJava2支持几种...
4. 当然,别忘了在应用退出时取消订阅,防止内存泄漏。 ```java Disposable disposable = apiService.fetchData().subscribe(...); // 在适当的时候取消订阅 disposable.dispose(); ``` 通过下载的"Retrofit2Rxjava...
在本资源中,RxJava2内存泄漏的处理通过使用RxLifecycle实现,RxLifecycle用于管理RxJava2的生命周期,防止内存泄漏的出现。 知识点7:Loading Dialog的实现 Loading Dialog是指异步请求过程中的等待对话框。在本...
在Android应用开发中,网络请求是必不可少的一部分,而有效地管理和处理网络请求的生命周期可以避免内存泄漏、提高用户体验。本文将详细介绍如何使用RxJava2、Retrofit2和RxLifecycle2这三款强大的工具来构建一个...
在Android开发中,RxJava2是一个非常重要的库,它引入了反应式编程的概念,使得异步处理、事件处理以及数据流管理变得更加优雅和简洁。本文将深入探讨RxJava2的基本使用,包括其核心概念、主要操作符以及如何在...
RxJava2是一个强大的Java库,它允许开发人员通过使用可观察序列来处理异步操作和事件。这个"RxJava2 Demo"旨在展示如何在实际应用中有效地利用RxJava2的功能。RxJava的核心概念是响应式编程,这是一种处理数据流和...
AutoDispose通过提供一种自动绑定和处理RXJava 2流的方法,使得订阅的生命周期与Android组件(如Activity、Fragment)的生命周期相匹配。这意味着当你的Activity或Fragment结束时,相关的RXJava订阅也会自动取消,...
在Android中,RxJava2常与Android的生命周期紧密结合,避免内存泄漏和不必要的资源消耗。例如,使用`subscribeOn()`指定数据的产生线程,`observeOn()`指定数据的消费线程,以及`Disposable`接口来管理订阅,确保在...
- 使用Retrofit的`CallAdapter`配合RxJava,可以更好地控制请求生命周期,避免内存泄漏。 - 使用`CompositeDisposable`管理多个订阅,便于一次性取消所有订阅。 - 注意内存管理,避免在Activity或Fragment中直接...
在Android开发中,内存泄漏是一个常见且严重的问题,尤其是在使用RxJava这样的复杂异步库时。这个名为"android-subscription-leaks"的开源项目提供了一个小示例应用程序,专门用于演示如何在使用RxJava时避免内存...
4. **取消订阅**:为了防止内存泄漏,当不再需要接收事件时,记得取消订阅。 ```java subscription.dispose(); ``` **RxBus的优点** 1. **解耦**:RxBus允许组件之间松散耦合,不需要知道事件的来源或目的地。 2. ...
使用`subscribeOn`和`observeOn`来控制在哪个线程上执行操作,并确保在适当的时候取消订阅,以防止内存泄漏。`Disposable`对象可以用来管理订阅的生命周期。 ### 7. 示例代码 在`RxJavaDemo`项目中,你可以找到...
`RxJava2` 和 `AsyncTask` 是两种常用的异步处理工具,但它们在处理线程间数据流的方式上有所不同。`RxJava2` 提供了一种更加灵活、强大的流式处理方式,而 `AsyncTask` 是 Android 自带的一种轻量级异步解决方案。...