RxJava在Android中内存泄漏解决以及RxJava的封装。
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了RxJava在Android中内存泄漏解决以及RxJava的封装。,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5333字,纯文字阅读大概需要8分钟。
内容图文
RxJava在现在是一个非常前卫的异步框架,也是由于他非常新,所以比较难以驾驭。
像okhttp直接在onStop或者onDestroy 调用它的cancel方法就行了,但是Rxjava并没有那么简单。
因为假如每次请求都得到Observable对象,然后再onStop中unsubscribe取消,这样很不利于封装。而且会造成代码量很多,所以我找到了用rxlifecycle的解决方案。
先导包
compile ‘com.trello:rxlifecycle:0.5.0‘
compile ‘com.trello:rxlifecycle-components:0.5.0‘
然后写RxActivity,原作者github上有源码,我根据自己的情况稍微修改了一下。
import android.os.Bundle;
import android.support.annotation.CallSuper;
import android.support.annotation.NonNull;
import android.support.v4.app.FragmentActivity;
import com.trello.rxlifecycle.ActivityEvent;
import com.trello.rxlifecycle.ActivityLifecycleProvider;
import com.trello.rxlifecycle.RxLifecycle;
import rx.Observable;
import rx.subjects.BehaviorSubject;
/**
* Created by a on 2016/5/6.
*/publicclassRxActivityextendsFragmentActivityimplementsActivityLifecycleProvider {publicfinal BehaviorSubject<ActivityEvent> lifecycleSubject = BehaviorSubject.create();
@NonNull@Overridepublic Observable<ActivityEvent> lifecycle() {
return lifecycleSubject.asObservable();
}
@NonNull@Overridepublic <T> Observable.Transformer<T, T> bindUntilEvent(@NonNull ActivityEvent event) {
return RxLifecycle.bindUntilEvent(lifecycleSubject, event);
}
@NonNull@Overridepublic <T> Observable.Transformer<T, T> bindToLifecycle() {
return RxLifecycle.bindActivity(lifecycleSubject);
}
@Override@CallSuperprotectedvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
lifecycleSubject.onNext(ActivityEvent.CREATE);
}
@Override@CallSuperprotectedvoidonStart() {
super.onStart();
lifecycleSubject.onNext(ActivityEvent.START);
}
@Override@CallSuperprotectedvoidonResume() {
super.onResume();
lifecycleSubject.onNext(ActivityEvent.RESUME);
}
@Override@CallSuperprotectedvoidonPause() {
lifecycleSubject.onNext(ActivityEvent.PAUSE);
super.onPause();
}
@Override@CallSuperprotectedvoidonStop() {
lifecycleSubject.onNext(ActivityEvent.STOP);
super.onStop();
}
@Override@CallSuperprotectedvoidonDestroy() {
lifecycleSubject.onNext(ActivityEvent.DESTROY);
super.onDestroy();
}
}
用自己的activity继承RxActivity.
在联网请求的地方加上
.compose(RxLifecycle.bindUntilEvent(lifecycle(), ActivityEvent.STOP))
意思是在Stop周期的时候取消请求。
我用了上一篇博客上传图片的例子,现在是MainActivity进入SecondActivity之后,点击按钮之后上传一张图片,然后获得返回结果。
File file = new File(Environment.getExternalStorageDirectory() + "/123.png");
HttpUtil.getIImagePP().upLoadImage("c1a2b3ab56a2f218aed9b2ab3c16ce88", "be8318b73cef1c2bcafb6c8a77922436", HttpUtil.postFileParams("img", file))
//封装了在子线程中运行,主线程subscribe,下文会讲如何封装。
.compose(RxHelper.io_main(SecondActivity.this))
//.compose(RxLifecycle.bindUntilEvent(lifecycle(), ActivityEvent.STOP))
.subscribe(new RxSubscriber<Object>() {
@Overridepublicvoid_onNext(Object o) {
L.e("aaaa");
tv.setText((String) o);
}
@Overridepublicvoid_onError(String msg) {
}
});
没有加.compose(RxLifecycle.bindUntilEvent(lifecycle(), ActivityEvent.STOP))这一句,点按钮上传,然后马上返回上一个activity的Log日志:
返回到MainActivity之后大概2秒钟之后,出现了这句
05-0618:37:58.59015642-15642/com.sanniuben.myapplication E/way: aaaa
加了之后就没有返回了。
可见他在onStop的时候取消了这次请求。
RxLifecycle作者的Github
RxFragment源码页
Fragment的操作也类似这样。只不过需要继承RxFragment
接下来是封装。
public
class
RxHelper {
//子线程运行,主线程回调
public
static <T> Observable.Transformer<T, T> io_main(final RxActivity context) {
returnnew Observable.Transformer<T, T>() {
@Overridepublic Observable<T> call(Observable<T> tObservable) {
return (Observable<T>) tObservable
.subscribeOn(Schedulers.io())
.doOnSubscribe(new Action0() {
@Overridepublicvoidcall() {
//每次请求主线程显示对话框
ProgressDialogUtil.showProgress(context, "正在加载,请稍候");
}
})
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.compose(RxLifecycle.bindUntilEvent(context.lifecycle(), ActivityEvent.STOP));
}
};
}
}
Subscriber
/**
* Created by a on 2016/5/6.
*/
public
abstract
class RxSubscriber<T> extends Subscriber<T>{
@Override
publicvoidonCompleted() {
//完成的时候取消对话框
ProgressDialogUtil.dismiss();
}
@Override
publicvoidonError(Throwable e) {
e.printStackTrace();
_onError(e.getMessage());
if (!NetUtils.isConnected(MyApplication.getContextObject())) {
Toast.makeText(MyApplication.getContextObject(), "请求失败,请检查网络!", Toast.LENGTH_SHORT).show();
ProgressDialogUtil.dismiss();;
return;
}
}
@Override
publicvoidonNext(T t) {
_onNext(t);
}
publicabstractvoid _onNext(T t);
publicabstractvoid _onError(String msg);
}
现在来看一下,新的请求
File file = new File(Environment.getExternalStorageDirectory() + "/123.png");
HttpUtil.getIImagePP().upLoadImage("c1a2b3ab56a2f218aed9b2ab3c16ce88", "be8318b73cef1c2bcafb6c8a77922436", HttpUtil.postFileParams("img", file))
//只需要加上这一句
.compose(RxHelper.io_main(SecondActivity.this))
//这里是new的我们自己的RxSubscriber
.subscribe(new RxSubscriber<Object>() {
@Overridepublicvoid_onNext(Object o) {
L.e("aaaa");
tv.setText((String) o);
}
@Overridepublicvoid_onError(String msg) {
}
});
这样就完成了rxjava的封装。现在实现了每次访问网络的时候显示对话框,请求完取消对话框,在Activity生命周期Stop的时候取消请求。
关于如何实现了rxJava的封装,去百度或者Google,搜一下rxJava的操作符compose就能明白了。
下班了,来不及解释太多了,如果看的人多,有时间再来更新细节。
项目demo地址(嫌麻烦没有分离模块,直接把项目未搭建完的框架放上来了):
Demo在上传,等会回去更新
原文:http://blog.csdn.net/adzcsx2/article/details/51333890
内容总结
以上是互联网集市为您收集整理的RxJava在Android中内存泄漏解决以及RxJava的封装。全部内容,希望文章能够帮你解决RxJava在Android中内存泄漏解决以及RxJava的封装。所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。