박상권의 삽질블로그

[안드로이드/Android]유용한 라이브러리 - TedRxOnActivityResult(RxJava를 활용한 startActivityForResult()) 본문

IT/Android-TIP (한글)

[안드로이드/Android]유용한 라이브러리 - TedRxOnActivityResult(RxJava를 활용한 startActivityForResult())

박상권 2017. 9. 1. 10:17

안드로이드 개발자들이 모여있는 오픈채팅방에 참여해보세요 .
Q&A 및 팁을 공유하는 방입니다..
오픈채팅방 참여



블로그를 Medium으로 옮겨서 운영하고 있습니다.
앞으로 새로운 글은 모두 미디엄 블로그를 통해서 올릴 예정입니다.
미디엄에서 다양하고 유익한 포스팅을 살펴보세요
미디엄 블로그 보기




Activity를 실행하고 해당 결과를 가져오거나 결과값을 알고 싶을때 우리는 startActivityForResult()를 사용합니다.


startActivityForResult()의 결과는 onActivityResult()에서 받아서 처리합니다.

만약 소스코드를 작성한다면 아래와 같이 작성할 수 있을것입니다.


 @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    
    startActivityForResult(intent,REQ_CODE_AAA);
    
  }

  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode){
      case REQ_CODE_AAA:
        if(resultCode==RESULT_OK){
          doSomething();
        }
        break;
      default:
        super.onActivityResult(requestCode, resultCode, data);    
    }
    
  }

하지만 이 작업은 은근 귀찮은 일입니다.

호출한곳에서 결과값을 받아야 하는데 다른곳에서 처리 하다보면 처리가 누락되는 문제가 생길 수도 있습니다.


특히 RxJava를 사용하고 있는경우 Chaining방식이 아니라 연속성을 해치게됩니다.

RxJava에서는 아래와 같은 방식으로 사용하고 있을겁니다.


  AA()
  .filter(...)
  .subscribeOn(...)
  .observeOn(...)
  .subscribe(...);


저는 startActivityForResult()와 결과값을 받아오는 방식도 위와같은 방식으로 사용하고 싶었습니다.


그래서 답답해서 제가 TedRxOnActivityResult를 만들었습니다.

TedRxOnActivityResult는 Chaining방식으로 startActivityForResult()를 수행하고 결과값을 받아올 수 있습니다.

https://github.com/ParkSangGwon/TedRxOnActivityResult








설정


현재 사용중인 RxJava의 버전에 따라서 선택할 수 있습니다.



RxJava1

dependencies { compile 'gun0912.ted:tedonactivityresult-rx1:1.0.2' }


RxJava2

dependencies { compile 'gun0912.ted:tedonactivityresult-rx2:1.0.2' }


Normal

RxJava를 사용하고 있지 않아도 사용할 수 있습니다.

dependencies { compile 'gun0912.ted:tedonactivityresult:1.0.2' }








사용 방법


RxJava1/RxJava2 모두 사용방법은 같습니다.

TedRxOnActivityResult.with(this)
    .startActivityForResult(intent)
    .subscribeOn(...)
    .observeOn(...)
    .subscribe(activityResult -> {

      if (activityResult.getResultCode() == RESULT_OK) {
        Intent data = activityResult.getData();
        String name = data.getStringExtra(SampleActivity.EXTRA_NAME);
        int age = data.getIntExtra(SampleActivity.EXTRA_AGE, -1);
      }

    });



RxJava를 사용하고 있지않거나 chaining방식을 원하지 않는다면, Listener를 활용하는 방식으로 사용할 수도 있습니다.

TedOnActivityResult.with(this)
    .setIntent(intent)
    .setListener((resultCode, data) -> {
       if (resultCode == RESULT_OK) {
        String name = data.getStringExtra(SampleActivity.EXTRA_NAME);
        int age = data.getIntExtra(SampleActivity.EXTRA_AGE, -1);
      }

    })
    .startActivityForResult();




Github에서 샘플프로젝트를 다운받아보시고 테스트해보시면 이해하시는데 좀더 수월합니다.

https://github.com/ParkSangGwon/TedRxOnActivityResult


이 라이브러리가 유용하셨다면 오른쪽 상단에 Star버튼도 꾹 눌러주시면 감사하겠습니다.



TedRxOnActivityResult를 활용하셔서 좀더 효율적인 코드를 작성하시고 코딩시간을 줄이시길 바랍니다.

감사합니다.



Comments