Android 성능 최적화 Rxlifecycle 로 RxJava 메모리 누 출 해결
사실 RxJava 가 일 으 킨 메모리 누 출 은 제 가 본의 아니 게 발 견 했 습 니 다.Retrofit 와 RxJava 가 결 합 된 과정 에서 어댑터 모드 를 통 해 어떻게 해결 되 었 는 지 알 고 싶 었 는데 RxJava 가 메모리 누 출 을 일 으 킬 수 있다 는 것 을 알 게 되 었 습 니 다.모든 자 료 를 찾 아 RxJava 가 일 으 킨 메모리 누 출 을 어떻게 해결 하 는 지 배 우려 고 했 습 니 다.Rxlifecycle 오픈 소스 프레임 워 크 를 이용 하여 해결 할 수 있 는 지 알 게 되 었 습 니 다.오늘 주말 에 Rxlifecycle 를 어떻게 사용 하 는 지 배 워 보 겠 습 니 다.
누 출 된 배경 참조:
RxJava 는 응답 식 프로 그래 밍 프레임 워 크 로 서 현재 프로 그래 밍 계 의 네트워크 가 빨 갛 고 누구나 다 알 고 있다 고 할 수 있다.간결 한 인 코딩 스타일,읽 기 쉬 운 체인 방식 호출,강력 한 비동기 지원 등 으로 RxJava 는 광범 위 하 게 사용 되 고 스 레 드 스케줄 러 를 통 해 스 레 드 를 제어 하고 자 르 기 쉽다.만약 에 이 작업 스 레 드 가 실행 되 지 않 으 면 Activity 나 Fragment 에서 탈퇴 한다.Activity 나 Fragment 에서 메모리 누 출 을 일 으 킬 수 없습니다.
Rxlifecy 는 무엇 입 니까?
rxlifecycle 은 trello 가 개발 한 RxJava 로 인 한 메모리 누 출 을 해결 하 는 오픈 소스 프레임 워 크 입 니 다.
github 주소:https://github.com/trello/RxLifecycle
Rxlifecycle 를 어떻게 사용 합 니까?
1.)build.gradle 파일 에 인용 추가
compile 'com.trello:rxlifecycle:1.0'
// If you want to bind to Android-specific lifecycles
compile 'com.trello:rxlifecycle-android:1.0'
// If you want pre-written Activities and Fragments you can subclass as providers
compile 'com.trello:rxlifecycle-components:1.0'
// If you want to use Navi for providers
compile 'com.trello:rxlifecycle-navi:1.0'
// If you want to use Kotlin syntax
compile 'com.trello:rxlifecycle-kotlin:1.0'
제 가 원 하 는 대로 추가 해 드 리 도록 하 겠 습 니 다.
compile 'com.trello:rxlifecycle:1.0'
compile 'com.trello:rxlifecycle-components:1.0'
2.)필요 에 따라 Activity 상속 RxActivity,Fragment 상속 RxFragment
public class MainActivity7 extends RxActivity {
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.text);
//
testRxJava();
finish();
}
private void testRxJava() {
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
int i = 0;
while (i < 1000000000) {
i++;
}
subscriber.onNext(String.valueOf(i));
subscriber.onCompleted();
}
}).compose(this.<String>bindUntilEvent(ActivityEvent.PAUSE))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
mTextView.setText(s);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
LApplication.getRefWatcher().watch(this);
}
}
현재 지원 하 는 Activity/Fragment 구성 도3.bindToLifecycle()을 사용 하 는 방식
하위 클래스 에 서 는 Observable 의 copose 연산 자 를 사용 하여 호출 하여 Observable 이 발표 한 이벤트 와 현재 구성 요소 의 연결 을 완성 하여 수명 주기 동기 화 를 실현 합 니 다.현재 구성 요소 의 수명 주기 가 끝 날 때 Observable 구독 을 자동 으로 취소 합 니 다.
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
int i = 0;
while (i < 1000000000) {
i++;
}
subscriber.onNext(String.valueOf(i));
subscriber.onCompleted();
}
}).compose(this.<String>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
mTextView.setText(s);
}
});
4.bindUntilEvent()방식 사용Activity Event 류 를 사용 하 는데 그 중의 CREATE,START,RESUME,PAUSE,STOP,DESTROY 는 각각 생명주기 내의 방법 에 대응한다.bindUntilEvent 를 사용 하여 생명주기 방법 이 호출 될 때 구독 을 취소 할 지 지정 합 니 다.
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
int i = 0;
while (i < 1000000000) {
i++;
}
subscriber.onNext(String.valueOf(i));
subscriber.onCompleted();
}
}).compose(this.<String>bindUntilEvent(ActivityEvent.PAUSE))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
mTextView.setText(s);
}
});
5.RxActivity/RxFragment 사용자 정의원 하 는 Activity 가 LifecycleProvider
public abstract class RxActivity extends Activity implements LifecycleProvider<ActivityEvent> {
private final BehaviorSubject<ActivityEvent> lifecycleSubject = BehaviorSubject.create();
public RxActivity() {
}
@NonNull
@CheckResult
public final Observable<ActivityEvent> lifecycle() {
return this.lifecycleSubject.asObservable();
}
@NonNull
@CheckResult
public final <T> LifecycleTransformer<T> bindUntilEvent(@NonNull ActivityEvent event) {
return RxLifecycle.bindUntilEvent(this.lifecycleSubject, event);
}
@NonNull
@CheckResult
public final <T> LifecycleTransformer<T> bindToLifecycle() {
return RxLifecycleAndroid.bindActivity(this.lifecycleSubject);
}
@CallSuper
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.lifecycleSubject.onNext(ActivityEvent.CREATE);
}
@CallSuper
protected void onStart() {
super.onStart();
this.lifecycleSubject.onNext(ActivityEvent.START);
}
@CallSuper
protected void onResume() {
super.onResume();
this.lifecycleSubject.onNext(ActivityEvent.RESUME);
}
@CallSuper
protected void onPause() {
this.lifecycleSubject.onNext(ActivityEvent.PAUSE);
super.onPause();
}
@CallSuper
protected void onStop() {
this.lifecycleSubject.onNext(ActivityEvent.STOP);
super.onStop();
}
@CallSuper
protected void onDestroy() {
this.lifecycleSubject.onNext(ActivityEvent.DESTROY);
super.onDestroy();
}
}
요약:본 고 는 RxLifeCycle 을 통 해 RxJava 의 메모리 누 출 문 제 를 해결 하 는 동시에 우리 에 게 경 고 를 했다.아무리 좋 은 프레임 워 크 도 좋 은 면도 있 고 나 쁜 면도 있다.이때 기술 선택 을 잘 하고 위험 을 회피 하 는 것 이 중요 하 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.