์๋๋ก์ด๋์ RxJava ํ์ฉ
์์ฑ์ : ๋ฐํ์
Present Time : 2018-09-20 (THU)
๊ธฐ์กด ์๋๋ก์ด๋ ๊ฐ๋ฐ์์ ๊ฐ์ฅ ์ด๋ ค์์ ๊ฒช๋ ๋ฌธ์ ์ค ํ๋๋ ๋ณต์กํ ์ค๋ ๋ ์ฌ์ฉ์ด๋ค. ๋ณต์กํ ์ค๋ ๋ ์ฌ์ฉ์ผ๋ก ๋ฐ์ํ๋ ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ์๋๋ก์ด๋์ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐ ์๋ฌ ํธ๋ค๋ง
- ์๋ง์ ํธ๋ค๋ฌ์ ์ฝ๋ฐฑ ๋๋ฌธ์ ๋ฐ์ํ๋ ๋๋ฒ๊น ๋ฌธ์
- 2๊ฐ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ ํ ๊ฒฐ๊ณผ๋ฅผ ํ๋๋ก ํฉ์ฑํ๋ ์์
- ์ด๋ฒคํธ ์ค๋ณต ์คํ
์๋ จ๋ ๋์ ๊ฐ๋ฐ์๋ ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์ ๋ฐ์ํ๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ๋๋ฒ๊น ํ๋ ๋ฐ ๋ง์ ์๊ฐ์ ํฌ์ํ๋ค.
RxAndroid ๋ ์ต๋ํ๊ธฐ ์ด๋ ค์ด ๋ถ๋ถ๋ ์์ง๋ง ๊ธฐ์กด ์๋๋ก์ด๋ ๊ฐ๋ฐ๊ณผ ๋น๊ตํ์ ๋ ์ฅ์ ์ด ๋ง๋ค. ๋ค์๊ณผ ๊ฐ์ ํน์ง์ ํตํด ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ ์ค๋ค.
- ๊ฐ๋จํ ์ฝ๋๋ก ๋ณต์กํ ๋ณํ(concurrency) ํ๋ก๊ทธ๋๋ฐ์ ํ ์ ์๋ค.
- ๋น๋๊ธฐ ๊ตฌ์กฐ์์ ์๋ฌ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ฝ๋ค.
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ๋ ๋ถ๋ถ์ ์ผ๋ก ์ ์ฉํ ์ ์๋ค.
RxAndroid๋ ๊ธฐ๋ณธ์ ์ผ๋ก RxJava์ ๋ฆฌ์กํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ๋ค. ์๋๋ก์ด๋์์ ์ด์ฉํ๋ ๋ฆฌ์กํฐ๋ธ API์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋นํ ๋ง๋ค.
* ์๋๋ก๋์์ ์ฌ์ฉํ ์ ์๋ ๋ฆฌ์กํฐ๋ธ API์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ) RxLifecycle, RxBinding, RxLocation, RxFit, RxWear, RxImagePicker, ReactiveNetwork, RxDataBinding ๋ฑ
gradle์ dependencies ๋ถ๋ถ์ RxAndroid ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํ๋ค.
์ฐธ๊ณ ) RxAndroid๋ RxJava์ ๋ํ ์์กด์ฑ์ด ์์ด RxJava๋ฅผ ์ถ๊ฐํ์ง ์์๋ ๋์ง๋ง, ์ต์ ๋ฒ์ ์ RxJava๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ช ์ํด ์ฃผ๋ ๊ฒ์ด ์ข๋ค.
dependencies{
// RxJava & RxAndroid
implementation 'io.reactivex.rxjava2:rxjava:2.2.2'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
// RxLifecycle
implementation 'com.trello.rxlifecycle2:rxlifecycle-android:2.2.2'
implementation 'com.trello.rxlifecycle2:rxlifecycle:2.2.2'
implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.2'
}
RxAndroid์ ๊ธฐ๋ณธ ๊ฐ๋ ์ RxJava์ ๋์ผํ๋ค. RxJava์ ๊ตฌ์กฐ์ ์๋๋ก์ด๋์ ๊ฐ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ๋ณ๊ฒฝํด ๋์ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ RxAndroid์ ๊ตฌ์ฑ ์์๋ ๋ค์์ฒ๋ผ RxJava์ ๊ตฌ์ฑ ์์์ ๊ฐ๋ค.
Observable
: ๋น์ฆ๋์ค ๋ก์ง์ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ค.๊ตฌ๋ ์
: Observable์์ ๋ฐํํ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ๋ ํ๋ค.์ค์ผ์ค๋ฌ
: ์ค์ผ์ค๋ฌ๋ฅผ ํตํด์ Observable, ๊ตฌ๋ ์๊ฐ ์ด๋ ์ค๋ ๋์์ ์คํ๋ ์ง ๊ฒฐ์ ํ ์ ์๋ค.
์ด๋ฌํ ๊ณผ์ ์ ๊ฐ๋จํ ์ฝ๋๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
Observable๊ณผ ๊ตฌ๋ ์๊ฐ ์ฐ๊ฒฐ๋๋ฉด ์ค์ผ์ค๋ฌ์์ ๊ฐ ์์๊ฐ ์ฌ์ฉํ ์ค๋ ๋๋ฅผ ๊ฒฐ์ ํ๋ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ์ด๋ค. Observable์ด ์คํ๋๋ ์ค๋ ๋๋ subscribeOn() ํจ์์์ ์ค์ ํ๊ณ ์ฒ๋ฆฌ๋ ๊ฒฐ๊ณผ๋ฅผ onserveOn() ํจ์์ ์ค์ ๋ ์ค๋ ๋๋ก ๋ณด๋ด ์ต์ข ์ฒ๋ฆฌํ๋ค.
// 1. Observable ์์ฑ
Observable.create()
.subscribe(); // 2. ๊ตฌ๋
์ ์ด์ฉ
// 3. ์ค์ผ์ค๋ฌ ์ด์ฉ
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
์ค์ผ์ค๋ฌ ์ด๋ฆ | ์ค๋ช |
---|---|
AndroidSchedulers.mainThread() | ์๋๋ก์ด๋์ UI ์ค๋ ๋์์ ๋์ํ๋ ์ค์ผ์ค๋ฌ |
HandlerScheduler.from(handler) | ํน์ ํธ๋ค๋ฌ์ ์์กดํ์ฌ ๋์ํ๋ ์ค์ผ์ค๋ฌ |
์๋๋ก์ด๋์ UI์ค๋ ๋๋ ๋ฉ์ธ์ค๋ ๋๋ฅผ ๋ปํ๋ค.
์ค๋ ๋์ Handler์ ๊ด๋ จํ ์์ธํ ๋ด์ฉ์ ๋ค์ ๊ธ์ ์ฐธ๊ณ [์คํฐ๋ 1ํ์ฐจ Thread , Handler , Looper ์ฐธ๊ณ ]
Observer<String> observer = new DisposableObserver<String>() {
@Override
public void onNext(String s){
textView.setText(s);
}
@Override
public void onError(Throwable e) { }
@Override
public void onComplete() { }
}
Observable.create(new ObservableOnSubscribe<String>(){
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception{
e.onNext("I'm student.");
e.onComplete();
}
}).subscribe(observer);
Observable.create()
๋ก Observable
์ ์์ฑํด 'I'm student.'(์ถ๋ ฅํ ํ
์คํธ) ๋ฅผ ์
๋ ฅ ๋ฐ๊ณ subscribe()
ํจ์ ์ onNext()
ํจ์์ ์ ๋ฌํ๋ค.
onNext() ํจ์๋ ์ ๋ฌ๋ ๋ฌธ์๋ฅผ ํ ์คํธ๋ทฐ์ ์ ๋ฐ์ดํธ ํ๋๋ก ์ ์๋์ด ์์ผ๋ฏ๋ก,
์ค์ ๊ตฌ๋
์๋ฅผ subscribe(observer)
ํจ์๋ฅผ ํตํด ๋ฑ๋กํ๊ณ ํธ์ถํ๋ฉด 'I'm student.' ๋ฅผ ํ
์คํธ๋ทฐ์ ํ์ํ๋ค.
Observable.<String> create(s->{
s.onNext("I'm smart!");
s.onComplete();
}).subscribe(o -> textView.setText(o));
์ 2.2.1๊ณผ ๋น๊ตํ๋ฉด ์ฝ๋ฐฑ ํจ์๋ฅผ ๋๋ค ํํ์์ผ๋ก ๋ฐ๊พธ๋ฉฐ ๋ฐ์ดํฐ์ ํ๋ฆ์ด ๋ช ํํด์ ธ ๊ฐ๋ ์ฑ์ด ์ข์์ก๋ค.
์ ๋ฌ์๋ ๋ช ํํ ๋จ์ด๋ก ๋ณ๊ฒฝํ ์๋ ์์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋์ ์ ๋ง์ด ์ฌ์ฉํ๋ค.
Observable.just("I'm hungry.")
.subscribe(textView::setText);
๋ฉ์๋ ๋ ํผ๋ฐ์ค
๋ฅผ ์ด์ฉํ์ฌ Observable์ ์์ฑ ์ฝ๋๋ฅผ ๋จ์ํ๊ฒ ํ๋ค.
์ฐธ๊ณ ) Observable
์ ์์ฑ ๋ฐฉ๋ฒ์ ์๋ ๋ค์ํ๊ณ ๊ฐ๋ฐ์์ ์ฑํฅ์ ๋ฐ๋ผ ์ ํ์ ๊ธฐ์ค์ด ๋ฌ๋ผ์ง ์ ์๋ค.
RxAndroid์๋ RxLifecycle
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ค.
์๋๋ก์ด๋์ Activity
์ Fragment
์ ๋ผ์ดํ ์ฌ์ดํด์ RxJava์์ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ค.
์๋๋ก์ด๋์ UI ๋ผ์ดํ ์ฌ์ดํด์ ๋์ฒดํ๋ค๊ธฐ๋ณด๋ค ๊ตฌ๋ ํ ๋ ๋ฐ์ํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. ์๋ฃํ์ง ๋ชปํ ๊ตฌ๋ ์ ์๋์ผ๋ก ํด์ (dispose) ํ๋ค.
Observable์ ์๋๋ก์ด๋์ Context๋ฅผ ๋ณต์ฌํ์ฌ ์ ์งํ๋ค. onComplete(), onError() ํจ์๊ฐ ํธ์ถ๋๋ฉด ๋ด๋ถ์์ ์๋์ผ๋ก unsubscribe() ํจ์๋ฅผ ํธ์ถํ๋ค.
๊ทธ๋ฐ๋ฐ ์กํฐ๋นํฐ๊ฐ ๋น์ ์์ ์ผ๋ก ์ข ๋ฃ๋๋ฉด ๋ทฐ๊ฐ ์ฐธ์กฐํ๋ ์กํฐ๋นํฐ๋ ์ข ๋ฃํด๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋์์ด ๋์ง ๋ชปํ๋ค. ๋ฐ๋ผ์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
์ด๋ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ ์ค ํ๋๊ฐ RxLifecycle์ ์ด์ฉํ๋ ๊ฒ์ด๋ค.
RxLifecycle
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋๋ก์ด๋์ ๋ผ์ดํ ์ฌ์ดํด์ ๋ง๊ฒ Observable
์ ๊ด๋ฆฌํ ์ ์๋ ์ปดํฌ๋ํธ๋ฅผ ์ ๊ณตํ๋ค.
์ปดํฌ๋ํธ | ์ค๋ช |
---|---|
RxActivity | ์กํฐ๋นํฐ์ ๋์ |
RxDialogFragment | Native/Support ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ DialogFragment ์ ๋์ |
RxFragment | Native/Support ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ Fragment ์ ๋์ |
RxPreferenceFragment | PreferenceFragment์ ๋์ |
RxAppCompatActivity | Support ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ DialogFragment์ ๋์ |
RxAppCompatDialogFragment | Support ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ AppCompatDialogFragment์ ๋์ |
RxFragmentActivity | Support ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ FragmentActivity์ ๋์ |
- build.gradle ํ์ผ์ depencies์ ์ถ๊ฐ
dependencies{
// RxLifecycle
implementation 'com.trello.rxlifecycle2:rxlifecycle-android:2.2.2'
implementation 'com.trello.rxlifecycle2:rxlifecycle:2.2.2'
implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.2'
}
Observable.interval()์ ์ด์ฉํด 1์ด์ ํ๋ฒ ๋ก๊ทธ๋ฅผ ์ฐ๋ค๊ฐ
ํ๋ฉด์ด ๋ค๋ก๊ฐ ์กํฐ๋นํฐ๊ฐ ์ข ๋ฃ๋์ด๋ unsubscribe(๊ตฌ๋ ํด์ )๋ฅผ ํ์ง ์๋๋ค๋ฉด, ์คํธ๋ฆผ์ ๊ณ์ ์ ์ง๋์ด ๋ก๊ทธ๊ฐ ๊ณ์ ์ฐํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
Observable.interval(0,1,TimeUnit.SECONDS)
.map(String::valueOf)
.subscribe(s -> Lob.i("###",s));
compose() ํจ์๋ก ๋ผ์ดํ ์ฌ์ดํด์ ๊ด๋ฆฌํ๋๋ก ์ถ๊ฐํ๋ค. Observable์ ํด๋น ํด๋์ค๊ฐ ์ข ๋ฃ๋๋ฉด ์๋์ผ๋ก ํด์ (dispose)๊ฐ ๋๋ค.
Observable.interval(0,1,TimeUnit.SECONDS)
.map(String::valueOf)
.compose(bindToLifecycle())
.subscribe(s -> Lob.i("Lifecycle ์ ์ฉํ Observable",s));
RxJava2 ์์๋ RxLifecycle์ ์ปดํฌ๋ํธ ์ด์ธ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
์๋ฅผ ๋ค์ด RxJava์ ์ต์ํ ๊ฐ๋ฐ์๋ค์ ์๋๋ก์ด๋์ ์ ํต์ ์ธ ๋ผ์ดํ์ฌ์ดํด ๊ด๋ฆฌ ๊ธฐ๋ฒ๋ณด๋ค๋ ์ง์ ๊ด๋ฆฌํ๊ธฐ ํธํ dispose() ํจ์๋ฅผ ์ฌ์ฉํ ๊ฒ ๋ฑ์ด ์๋ค.
์ด๋ค ๊ฒ์ด ์ข๋ค๊ณ ์ด์ผ๊ธฐํ๊ธฐ๋ ์ด๋ ต๊ณ ๊ฐ๊ฐ ์ฅ,๋จ์ ์ด ์๋ค. ์ํฉ์ ๋ง๊ฒ ๊ฐ๋ฐ์๊ฐ ์ ์ ํํ์ฌ ์ฌ์ฉํ๋ฉด ๋๋ค.
OkHttp๋ ์๋๋ก์ด๋์์ ์ฌ์ฉํ ์ ์๋ ๋ํ ํด๋ผ์ด์ธํธ ์ค ํ๋์ด๋ฉฐ ํ์ด์ค๋ถ์์ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ์ ๋ช ํ๋ค. SPDY/GZIP ์ง์ ๋ฑ ๋คํธ์ํน ์คํ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ณ , ๋น ๋ฅธ ์๋ต์๋๋ฅผ ๋ณด์ผ ์ ์๋ค๋ ์ ์ด ์ฅ์ ์ด๋ค.
Retrofit์ ์๋ฒ ์ฐ๋๊ณผ ์๋ต ์ ์ฒด๋ฅผ ๊ด๋ฆฌํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. OkHttp๊ฐ ์๋ฒ์์ ์ฐ๋ ๊ด๋ จ ๊ธฐ๋ฅ๋ง ์ ๊ณตํ๋ค๋ฉด ์๋ต๊น์ง ๊ด๋ฆฌํด์ค๋ค๋ ๋ฉด์์ ํธ๋ฆฌํ๋ค. Retofit 1.x ๋ฒ์ ์์๋ OkHttp, HttpClient ๋ฑ ์ฌ์ฉ์๊ฐ ์ํ๋ ํด๋ผ์ด์ธํธ๋ฅผ ์ ํํด์ ์ฌ์ฉํ ์ ์์์ง๋ง, 2.x ๋ฒ์ ์์๋ HttpClient๋ ๋ ์ด์ ์ฌ์ฉํ ์ ์๊ณ OkHttp์ ์์กดํ๋๋ก ๋ณ๊ฒฝ๋์๋ค.
Retrofit์ ์ฅ์ ์ค ํ๋๋ ์ด๋ ธํ ์ด์ ์ ์ง์ํ๋ ๊ฒ์ด๋ค. ์คํ๋ง์ฒ๋ผ ์ด๋ ธํ ์ด์ ์ผ๋ก API๋ฅผ ์ค๊ณํ ์ ์๋ค. ์๋ฅผ ๋ค์ด @Header๋ฅผ ์ด์ฉํ์ฌ ํค๋๋ฅผ ์ค์ ํ๊ณ , @GET์ด๋ @POST ๋ฑ์ผ๋ก ์ฌ์ฉํ HTTP ๋ฉ์๋๋ฅผ ์ ์ธํ ์ ์๋ค.
Retrofit์ RxJava๋ฅผ ์ ์์ผ๋ก ์ง์ํ๋ฏ๋ก Observable์ API ๋ฆฌํด๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. ๊ทธ ์ธ์ Call๊ณผ Future ์ธํฐํ์ด์ค๋ ์ง์ํ๋ค.
Java๋ฅผ ์ด์ฉํ ๊ธฐ์กด ์ฝ๋
public interface RestAPI {
@GET(APIUrl.QUIZZES_URL)
Call<JsonObject> quizzes();
@FormUrlEncoded
@POST(APIUrl.LOGIN_URL)
Call<JsonObject> login(@Field("kakaoID") long kakaoId);
@FormUrlEncoded
@POST(APIUrl.UPDATE_EXP)
Call<JsonObject> updateExp(@Field("exp") int exp, @Field("id") long id);
}
RxJava๋ฅผ ์ ์ฉํ ์ฝ๋
๋ฐํ๊ฐ์ด Observable์ธ ๊ฒ์ด ์ฐจ์ด์ ์ด๋ค.
public interface RestAPI {
@GET(APIUrl.QUIZZES_URL)
Observable<JsonObject> quizzes();
@FormUrlEncoded
@POST(APIUrl.LOGIN_URL)
Observable<JsonObject> login(@Field("kakaoID") long kakaoId);
@FormUrlEncoded
@POST(APIUrl.UPDATE_EXP)
Observable<JsonObject> updateExp(@Field("exp") int exp, @Field("id") long id);
}
Rxjava์ Retrofit2์ ์ฐ๊ฒฐํ๊ธฐ ์ํ ์ด๋ํฐ๋ก ์ฌ์ฉํ๊ธฐ ์ํด ์ถ๊ฐํ๋ค. ์ ํํ๋ RxJava2CallAdapterFactory
๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํจ์ด๋ค. ์๋์ ๊ฐ์ด retrofit instance๋ฅผ ๋น๋ ํ ๋ RxJava2CallAdapterFactory
๋ฅผ ์ถ๊ฐํด ์ฃผ๋ฉด ์๋์ฒ๋ผ Observable
์ด๋ Single
๊ฐ์ ํ์
์ ๋ฑ์ ์ ์๊ฒ ๋๋ค.
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://google.com/")
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
// RxJava + Retofit + OkHttp
private void startRx(){
GithubServiceApi service = RestfulAdapter.getInstance().getServiceApi();
Observable<List<Contributor>> observable =
service.getObContributors(name,repo);
mCompositeDisposable.add(
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
//Observable์ ๊ตฌ๋
.subscribeWith(new DisposableObserver<List<Contributor>>(){
@Override
public void onNext(List<Contributor> contributors){
for(Contributor c : contributors){
log(c.toString());
}
}
})
)
}
startRx() ๋ฉ์๋๋ RestfulAdapter ํด๋์ค์ getServiceApi() ๋ฉ์๋ ์ retrofit ๋ณ์๋ฅผ ์ด์ฉํด ์์ฑ๋ API ํ๋ฝ์๋ฅผ ๊ฐ์ ธ์จ๋ค. owner์ repo์ ๊ฐ์ ์ ๋ฌํ๋ฉด observable ๋ณ์์ ์ ์ฅ๋ Observable์ ๋ฆฌํดํ๋ค. ์์ฑ๋ Observable์ ๊ตฌ๋ ์๋ฅผ ์ค์ ํ๋ฉด getServiceApi() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ github.com์์ ์ ๋ณด๋ฅผ ์ป์ด์จ๋ค.
๊ฒฐ๊ณผ๋ ๊ตฌ๋ ์๊ฐ ์์ ํ๊ฒ ๋๊ณ GSON์์ Contributor ํด๋์ค์ ๊ตฌ์กฐ์ ๋ง๊ฒ ๋์ฝ๋ฉํ ๋ค์ UI์ค๋ ๋๋ฅผ ์ด์ฉํด ํ๋ฉด์ ์ ๋ฐ์ดํธํ๋ค.
์์ฑ๋ Disposable ๊ฐ์ฒด๋ฅผ CompositeDisposable์์ ๊ด๋ฆฌํ๋๋ก CompositeDisposable.add() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๊ฐํ๋ค. CompositeDisposable
์ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ Disposable
๊ฐ์ฒด๋ฅผ ํ๋ฒ์ ๊ด๋ฆฌํ ์ ์๋ค.
protected void onDestroy() {
super.onDestroy();
mCompositeDisposable.clear();
}
[๊ธฐ์กด Java ์ฝ๋]
// Retofit + OkHttp
Call<JsonObject> call = restAPI.updateExp(30,pref.getLong("userID", 0));
call.enqueue(new Callback<JsonObject>() {
@Override
public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
if (response.code() == 200) {
Log.d("response----", response.body().toString());
}
}
@Override
public void onFailure(Call<JsonObject> call, Throwable t) {
Log.d("ERROR! onFailure!", t.toString());
}
});
์์ ๋์ผํ๋ค. ํ์ง๋ง getXXX ๋ฉ์๋์ ์คํ์ ์ํด์๋ retrofit์์ ์ ๊ณตํ๋ Call ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ค. Call ์ธํฐํ์ด์ค์ enqueue() ๋ฉ์๋์ ์ฝ๋ฐฑ์ ๋ฑ๋กํ๋ฉด GSON์์ ๋์ฝ๋ฉํ ๊ฒฐ๊ณผ๋ฅผ ํ๋ฉด์ ์ ๋ฐ์ดํธํ ์ ์๋ค.
[๋์] RxJava ํ๋ก๊ทธ๋๋ฐ (์ ๋ํ, ๋ฐ์ ์ค ์ง์)