IT 이모저모

Android 8.0과 Reactive Extensions을 이용한 응용프로그램 개발 - 6

exien 2018. 3. 15. 09:30

데이터 업데이트 처리

 일반적으로 RecyclerView을 사용한 화면 데이터 갱신 처리는 "초기 화면했을 때 업데이트" "화면 상단에서 당겨 업데이트"와 "아래로 스크롤하면 다음 페이지를로드 '의 3 가지가 있습니다 .

 앞의 2 개는 특히 망설임없이 Fragment # onResume ()과 SwipeRefreshLayout # setOnRefreshListener ()에서 데이터로드 처리를 호출하면 좋을 것입니다.

 세 번째 아래로 스크롤하면 다음 페이지를로드 처리에 대해서는 RxJava + RxBinding (recyclerview-v7) 라이브러리를 이용하면 안전하고 간단하게 구현할 수 있습니다. 다음 코드에서 볼 수 있듯이 데이터로드 중에 화면 하단 도달 이벤트를 발생시키지 않는 이벤트를 중복 발생시키지 않는 등의 제약을 부과 할 수 있습니다.

public class UserListFragment extends Fragment { ...     
    
    
    @Override public View onCreateView ( LayoutInflater inflater , ViewGroup container , Bundle savedInstanceState ) { ...
        
        
        
        bindEvents (); }
    
    
    ...
    
    / **
     * 이벤트 핸들러를 등록합니다.
     * / private void bindEvents () { ...
      
        
        
        // RecyclerView의 스크롤 이벤트 RxRecyclerView . scrollEvents ( mRecyclerView ) //로드 완료까지 무시 . skipUntil ( mDataLoadedNotification ) // 하단에 도달하면 . filter ( REACH_BOTTOM ) // 한 번만 통지 . take ( 1 ) // 통지가 완료되면 또한 Listen한다 . repeat () // 통지가 시작되면 진행률 대화 표시 . doOnNext ( e -> ProgressDialogFragment . show ( getFragmentManager ())) // 핸들러를 설정 .
        
                
                
                
                
                
                
                
                
                
                 
                
                subscribe ( this :: onReachBottom ); }
    
    
    ...
    
    / **
     * 목록의 하단 도달 이벤트를 처리합니다.
     *
     * @param ignore {@link RecyclerViewScrollEvent}
     * / private void onReachBottom ( final RecyclerViewScrollEvent ignore ) { 
        loadUserList (); } }
       
    

 위의 코드에서 사용하는 REACH_BOTTOM는 RecyclerViewScrollEvent에 하단에 도달했는지 여부를 확인하는 술어 (Predicate 인터페이스의 구현)입니다. RxBinding을 사용하지 않는 경우라면 RecyclerView.OnScrollListener 구현 클래스에서 비슷한 구현을하고 있다고 생각합니다.

/ **
 * RecyclerView의 스크롤 하단에 도달했는지를 판정 {@link Predicate}
 * / private static final Predicate < RecyclerViewScrollEvent > REACH_BOTTOM = e -> Optional . of ( e ) // view를 얻을 . map ( RecyclerViewScrollEvent :: view ) // 레이아웃 매니저를 취득 . map ( RecyclerView :: getLayoutManager ) // LinearLayoutManager 에 캐스팅 . map ( LinearLayoutManager . class :: cast ) // 요소가 하나 이상 있는지?
    
        
        
        
        
        
        
        
        . filter ( lm -> lm . getItemCount () > 0 ) // 마지막 요소가 보이고 있는가? . map ( lm -> { // 마지막 요소의 인덱스 final int last = lm . getItemCount () - 1 ; // 지금 보이고있는 마지막 요소의 인덱스 final int curr = lm . findLastCompletelyVisibleItemPosition ();  
        
         
            
                 
            
             
            
            return last <= curr ; }). orElse ( false );  
        

 여기서 이용한 RxBinding (recylerview-v7) 라이브러리는 build.gradle을 다음과 같이 설정해야합니다. 이쪽도 ProGuard 설정은 필요하지 않습니다.

dependencies { ... 의미 ...
    
    
    compile 'com.jakewharton.rxbinding2 : rxbinding-recyclerview-v7 : 2.0.0'
    
    ... 생략 ... }

마지막으로

 Android 8.0, Android Studio 3.0과 Reactive Extensions (RxJava2)을 중심으로 유용한 라이브러리를 이용한 Android 어플리케이션 개발에 대해 채팅 애플리케이션을 주제로 설명했습니다. 특히 desugar에 의한 Java 8 빌드 환경은 RetroLambda를 이용하는 경우의 문제점 (메소드의 증가, Java 8 코드를 포함한 타사 라이브러리는 사용할 수 없음)를 해결합니다. Jack 지원 종료되어 버린 적도 감안하면 당분간 사실상의 표준으로 군림하는 것이 아닐까요. 이 기회에 RetroLambda와 Jack에서 마이그레이션 보는 것은 어떨까요?

 또한 RxJava이 열 Reactive Extensions의 세계는 Android 어플리케이션의 개발에도 유용한 것이 많이 있습니다, Rx를 이벤트 Pub / Sub기구로서 파악하면 이벤트 자체를 중간에서 가공하거나 이벤트의 유량을 제어 하는 등 수 쉽게 구현할 수있는 것이 가장 유용한 점은 아닐까요.

 또한, 첨부 된 소스 코드 는 기사는 쓰고 나오지 못했다 아래의 구현도 포함되어 있습니다. 뭔가 도움이 되었으면합니다.

  • Fragment 간 전이에서 Shared Elements Transition
  • AndroidKeyStore를 사용한 로컬에 암호화 데이터 저장
  • XML에서 조정 가능한 설정 항목을 갖는 사용자 정의 View

developer.android.com의 콘텐츠 이용에 따른 표기

 Portions of this page are reproduced from work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.