삽질도사

[안드로이드] rxjava로 실시간 검색기능 만들기(debounce) 본문

안드로이드

[안드로이드] rxjava로 실시간 검색기능 만들기(debounce)

전성진블로그 2021. 12. 9. 21:25
반응형

일단 dependencies추가하고 sync합니다.

dependencies {
    implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
    implementation 'io.reactivex.rxjava3:rxjava:3.0.7'
    implementation 'com.jakewharton.rxbinding4:rxbinding:4.0.0'
}

 

rxjava를 활용해서 xml의 EditText를 관찰하기 위해 RxAndroidUtils라는 클래스를 하나 생성해줍니다.

public class RxAndroidUtils {
    private static final String RXTAG = RxAndroidUtils.class.getSimpleName();
    private static RxAndroidUtils instance;

    private RxAndroidUtils(){}

    public static RxAndroidUtils getInstance(){
        if(instance == null)
            instance = new RxAndroidUtils();
        return instance;
    }

    public Observable<String> getEditTextObservable(EditText editText){
        return RxTextView.textChanges(editText).map(charSequence -> charSequence.toString());
    }

    public String getTAG(){
        return RXTAG;
    }
}

 

이후에 원하는 main에서 Disposable을 하나 생성하고(나중에 옵져버블 버릴려고)

debounce로 약간의 딜레이를 주고(안그러면 타이핑하기 전에 계속 검색됨)  

subscribe에서 원하는 기능을 구현하면 됩니다.

private Disposable ET_Observable_Disposable;

Observable<String> editTextObservable =
                RxAndroidUtils.getInstance().getEditTextObservable(binding.searchET);

ET_Observable_Disposable = editTextObservable
                .debounce(500, TimeUnit.MILLISECONDS) //디바운스로 500만큼 검색딜레이
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(s->{ //EditText의 내용을 s로 받아온 겁니다.
                /////////////////////////////////////////////////////////////원하는 기능추가
                    Log.d(RxAndroidUtils.getInstance().getTAG(),s);
                    if(s.length() >= 2) {
                        Loaded_Posts.clear();
                        adapter.NoMore_Load(true);
                        KeyWord = s;
                        Search(KeyWord);
                    }
                    else if(s.length() == 1){
                        Toast.makeText(this,"두 글자 이상 적어주세요.",Toast.LENGTH_SHORT).show();
                    }
                    /////////////////////////////////////////////////////////////
 });

 

이후에 activity가 onDestroy되면 아까 만든 Disposable로 observable을 제거해줍니다.

@Override
    protected void onDestroy() {
        super.onDestroy();
        ET_Observable_Disposable.dispose();
    }

 

그러면 아래처럼 됩니다!

타이핑할 때마다 자동으로 검색되니까 버튼이 필요없다?!

 

참고블로그:

https://taehyungk.github.io/posts/android-RxJava2-Disposable/

 

[RxJava2] Disposable - 메모리 누수를 막아보자

Disposable

taehyungk.github.io

https://onlyfor-me-blog.tistory.com/415

 

[Rxjava] Disposable이란? CompositeDisposable이란?

Rxjava는 데이터를 발행하는 생산자, 발행된 데이터를 받아 처리하는 소비자로 나눠진 형태로 구성된 Reactive Streams를 바탕으로 하는 라이브러리다. 또한 옵저버 패턴을 확장해서 관찰 대상 객체의

onlyfor-me-blog.tistory.com

https://black-jin0427.tistory.com/74

 

[Android, RxBinding] RxBinding 사용기

안녕하세요. 블랙진입니다. 이번에는 RxBinding 사용법에대해 간단히 소개해 보겠습니다. 아주 Simple 하게 EditText 를 만들고 그 내용을 TextView 에 바로바로 표시하는 예제입니다. 1. app - build.gradle 에.

black-jin0427.tistory.com

https://terry-some.tistory.com/48

 

RxJava를 사용한 Debounce 구현

이번 포스트에서는 RxJava를 사용하여 간단하게 EditText에 Debounce를 구현하는 시간을 가져보도록 하겠습니다. 우선 시작하기에 앞서 Debounce가 무엇인지 알아보고 가도록 하겠습니다. Debounce vs. Thrott

terry-some.tistory.com

https://selfish-developer.com/entry/RxJava-Observable-Observer

 

RxJava - Observable, Observer

좀더 리액티브한(reactive) UI를 만들기 위해서 프로젝트에 RxJava, RxAndroid를 도입하면서 가장 어려웠던 점은 Observable과 Observer 클래스를 개념적으로 이해하는 것이었다. 옵저버 패턴을 응용한 라

selfish-developer.com

 

반응형