pinkred's mobile program

pinkred mobile programer

Archive for 5월 2017

Android Rxjava2

leave a comment »

  • Rxjava2를 시작한지 얼마 되지는 않았다.
  • 관련된 서적도 사보고 해보았지만 밀려드는 신 기술에 이론만 파악될뿐 실무에 적용하려고 하니 너무나 어려운 문제가 많았다. 그중에서 가장 어려운 이슈는 답이라는 것이다.  1에서 10까지 더하는  코드를 작성하고자 한다면 한 최소 3가지 이상의 방법이 있을것이다. 대략 어떤 방식으로 하면 좋을지는 어렵지 않게 생각한다. 하지만 Rxjava에서 이런 경우 어떻게 해야할까 라고 생각할테 마땅히 답을 줄수 있는 사이트도 찾아보기 힘들고 국내 관련 블로그도 쉽지 않다.
  • 그래서 내가 쓰면서 아 이렇게 하면 되더라를 체험하면서 얻는 내용들을 정리하려고 한다.
  • Rxjava2를 사용하고 RxAndroid를 연동하여 사용한다.
  • CompositeDisposable를 사용하여 관리한다.
  • ramda를 사용한다.
  • 네트워크는 retrofit2를 사용한다.

계속적으로 사용하면서 추가하도록 한다.

  1. 스케줄러는 스레드로 결과는 메인 스레드로 해야 할 경우(예시로 네트워크 연동)

    mMobileService.getSuggests(url, keyword)//
                .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());
  2. class A →  class B의 형식으로 변환 시키고 싶은 경우.

    BaseDto -> List 로 변환하여 리턴
    Observable getSuggests(String keyword);
    MobileAPI.getInstance(context).getSuggests(keyword).map((suggestsDataBaseDto) ->
    {
        List list = null;
        if (suggestsDataBaseDto != null)
        {
            if (suggestsDataBaseDto.code == 100 && suggestsDataBaseDto.data != null)
            {
                list = suggestsDataBaseDto.data.getSuggestList();
            } else
            {
                throw new BaseException(suggestsDataBaseDto.code, suggestsDataBaseDto.messasge);
            }
        } else
        {
            throw new BaseException(-1, null);
        }
        return list;
    }).observeOn(AndroidSchedulers.mainThread());
  3. 특정 시간 후에 스케줄러가 동작하는 경우

    1) 스케줄러를 호출하고 특정 시간후에 결과를 받는다.

    addCompositeDisposable(suggestRemote.getSuggests(keyword)//
        .delay(5000, TimeUnit.MILLISECONDS).subscribe(suggests -> onSuggests(suggests), throwable -> onSuggests(null)));

    2) 특정시간 후에 스케줄러를 호출하고 결과를 받는다.

    addCompositeDisposable(suggestRemote.getSuggests(keyword)//
        .delaySubscription(500, TimeUnit.MILLISECONDS).subscribe(suggests -> onSuggests(suggests), throwable -> onSuggests(null)));
  4. 두개의 스케줄러가 끝날때까지 대기하여 둘다 끝나면 실행하는 경우.
Observable.zip(transitionObservable, networkObservable, new BiFunction<Boolean, Boolean, Boolean>()
{
@Override
public Boolean apply(Boolean o, Boolean o2) throws Exception
{
return null;
}
}).subscribe(new Consumer<Boolean>()
{
@Override
public void accept(Boolean aBoolean) throws Exception
{
ExLog.d("pinkred : " + aBoolean);
}
});

5. 순차적으로 실행시키고 싶을때 예를 들어서 시간을 얻은 후에 얻은 시간 값으로 상세화면을 얻고 해당 값으로 기타등등을 얻고 싶을때..

getCommonDateTime().flatMap(new Function<CommonDateTime, Observable<User>>()
{
@Override
public Observable<User> apply(@io.reactivex.annotations.NonNull CommonDateTime commonDateTime) throws Exception
{
return new ProfileRemoteImpl(getActivity()).getProfile();
}
}).flatMap(new Function<User, Observable<UserInformation>>()
{
@Override
public Observable<UserInformation> apply(@io.reactivex.annotations.NonNull User user) throws Exception
{
return new ProfileRemoteImpl(getActivity()).getUserInformation();
}
}).subscribe(new Consumer<UserInformation>()
{
@Override
public void accept(@io.reactivex.annotations.NonNull UserInformation userInformation) throws Exception
{

}
}));

6. RxJava로 뒤로가기 버튼 확인 기능 구현하기

Written by pinkredmobile

2017/05/04 at 9:11 am

프로그래밍(programming)에 게시됨

Tagged with ,