
안드레스 니에토 포라스(https://www.flickr.com/photos/anieto2k) 제공
카우치베이스 라이트 는 백그라운드 스레드를 사용하여 복제(동기화)를 실행합니다. 복제 시작 및 중지는 동기적으로 이루어지지 않습니다. 이로 인해 복제 상태를 감지하는 데 실수가 발생할 수 있습니다.
그리고 복제 클래스 에는 플랫폼에 따라 실행 중 속성 또는 다음과 같은 편리한 루틴 isRunning(). 이것은 복제 상태를 확인하는 가벼운 방법입니다.
하지만 이를 사용하면 예기치 않은 결과가 발생할 수 있습니다. 예를 들어 저는 최근에 연속 복제를 사용하는 유틸리티를 작성했습니다. 이 유틸리티에는 시작 및 중지 토글 버튼이 있습니다. 이 유틸리티는 isRunning 를 클릭하여 버튼 상태를 업데이트합니다. 이것은 나쁜 생각인 것으로 밝혀졌습니다. 변경 사항이 백그라운드에서 발생한다는 점을 고려하면 당연한 일이지만 간과하기 쉽습니다.
대신 선호하는 접근 방식은 변경 수신기를 사용합니다. 다음은 예시입니다.
두 개의 클래스가 있습니다. 데이터베이스 헬퍼 클래스는 단순화를 위해 몇 가지 표준 연산을 래핑합니다. 콜백 패턴을 사용하는 인터페이스를 추가했습니다. 클라이언트 클래스가 이를 구현해야 합니다. 헬퍼 클래스는 클라이언트에 아무 것도 전달하기 전에 Couchbase Lite 변경 알림을 소화합니다. 이렇게 하면 우려 사항을 잘 분리할 수 있습니다.
아래 코드 목록은 개요입니다. 필수적인 부분만 보여줍니다. 먼저 헬퍼 클래스를 살펴보겠습니다.
|
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
public 클래스 DBHelper 구현 복제.변경 리스너 { 비공개 부울 복제 활성 = false; 비공개 목록 stateListeners = new ArrayList<>(); ... public 인터페이스 복제 상태 리스너 { void onChange(부울 isActive); } public void 시작 복제(URL 게이트웨이, 부울 연속) { ... pushReplication.추가 변경 리스너(이); pushReplication.시작(); } public void 중지복제() { ... } public void 추가 복제 상태 리스너(복제 상태 리스너 리스너) { stateListeners.추가(리스너); } public void 제거복제상태 리스너(복제 상태 리스너 리스너) { stateListeners.제거(리스너); } // 복제.변경 리스너 오버라이드 public void 변경됨(복제.변경 이벤트 변경 이벤트) { 만약 (변경 이벤트.getError() != null) { 던지기 가능 마지막 오류 = 변경 이벤트.getError(); // 오류에 반응하기 반환; } 만약 (변경 이벤트.getTransition() == null) 반환; 복제 상태 dest = 변경 이벤트.getTransition().목적지 가져오기(); 복제 활성 = ((dest == 복제 상태.중지 || dest == 복제 상태.중지됨) ? false : true); stateListeners.forEach(리스너 -> 리스너.onChange(복제 활성)); } } |
DBHelper는 다음과 같이 복제.변경 리스너 인터페이스입니다. 이것은 Couchbase Lite에서 정의한 인터페이스입니다. In 시작 복제 이 리스너를 리플리케이션에 추가합니다. 재정의할 수 있는 메서드가 하나 있습니다, 변경됨. . 변경 이벤트 전달된 값은 여러 가지 값을 가질 수 있습니다. 이 예에서는 먼저 오류를 확인하고 오류가 발생하면 사용자에게 알립니다. 그렇지 않으면 이것이 복제 상태 전환 이벤트인지 확인합니다. 대상 상태는 다음 중 하나일 수 있습니다. 초기, 러닝, IDLE, 오프라인, 중지또는 중지됨.
이 경우에는 복제가 종료되는지 여부만 알고 싶기 때문에 반환값을 단순화했습니다. 클라이언트가 둘 이상의 리스너를 등록할 수 있도록 허용하므로 마지막 코드 비트는 모든 콜백을 반복하여 호출합니다.
클라이언트 클래스는 훨씬 더 간단합니다. 이 클래스는 헬퍼 클래스에서 필요한 인터페이스를 구현합니다. 인스턴스를 생성하는 동안 리스너를 등록하기만 하면 됩니다. onChange UI에서 필요한 모든 작업을 수행합니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public 클래스 클라이언트 구현 DBHelper.복제 상태 리스너 { 비공개 DBHelper 서비스 = DBHelper.getInstance(); ... public 클라이언트() { 서비스.추가 복제 상태 리스너(이); } ... // DB헬퍼.복제 상태 리스너 @오버라이드 public void onChange(부울 isActive) { // 변경 사항을 처리하는 코드 } } |
이 코드는 제가 만든 도구에서 가져온 것입니다. 도구 자체에 대한 자세한 내용은 이 게시물소스 코드는 GitHub에서 찾을 수 있습니다. 여기.
포스트 스크립트
더 많은 리소스를 확인하세요. 개발자 포털 트위터에서 팔로우하세요 카우치베이스 개발.
질문에 대한 답변을 게시할 수 있습니다. 포럼. 그리고 다음에도 적극적으로 참여합니다. 스택 오버플로.
트위터로 연락주세요 호드그릴리
[...]는 DBService 헬퍼 클래스에서 제공됩니다. 여기에서 복제 상태 감지에 대해 조금 썼습니다. 이 앱에서는 동기화 버튼 [...]을 유지하기 위해 복제가 실행 중인지 여부만 알면 됩니다.
[...] 다른 리스너를 사용하면 복제 상태에 따라 바쁘게 대기 중인 스피너(무기한 진행률 표시줄)를 표시할 수 있습니다. 복제 상태 모니터링에 대한 자세한 내용은 여기에서 확인할 수 있습니다. [...]