일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- VMware
- 이미지로딩 라이브러리
- Logcat
- ButterKnife
- AWS
- OTTO
- 안드로이드
- 안드로이드 스튜디오
- 안드로이드 라이브러리
- 라이브러리
- 아마존웹서비스
- Mac
- 커스텀뷰
- Glide
- Picasso
- Today
- Total
박상권의 삽질블로그
[안드로이드/Android]유용한 라이브러리 - TedRxOnActivityResult(RxJava를 활용한 startActivityForResult()) 본문
[안드로이드/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를 활용하셔서 좀더 효율적인 코드를 작성하시고 코딩시간을 줄이시길 바랍니다.
감사합니다.
'IT > Android-TIP (한글)' 카테고리의 다른 글
[안드로이드/Android]8.0 오레오 알림채널(Notification Channel) 대응하기 (3) | 2018.02.04 |
---|---|
[안드로이드/Android]빌드시간 최적화하기(빌드시간 70%감소) (3) | 2017.09.28 |
[안드로이드/Android]Flavors로 같은 소스코드 다른앱 만들기 (5) | 2017.05.12 |
[안드로이드/Android]tools attribute 유용하게 활용하기(xmlns:tools="http://schemas.android.com/tools") (11) | 2017.04.01 |
[안드로이드/Android]GIF로 '로딩중' Dialog 띄우는 방법 (2) | 2017.03.18 |