Android 성능 최적화 Rxlifecycle 로 RxJava 메모리 누 출 해결

7512 단어 android누설 하 다
선언:
사실 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인 터 페 이 스 를 실현 하면 됩 니 다.Rx Activity 의 원본 코드 를 붙 여 수정 하면 됩 니 다. 

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 의 메모리 누 출 문 제 를 해결 하 는 동시에 우리 에 게 경 고 를 했다.아무리 좋 은 프레임 워 크 도 좋 은 면도 있 고 나 쁜 면도 있다.이때 기술 선택 을 잘 하고 위험 을 회피 하 는 것 이 중요 하 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기