Android에서 데이터 동기화를위한 디자인


23

대부분의 앱에서 서버와 클라이언트 간의 데이터 동기화를위한 두 가지 구현이있었습니다. 이것은 GCM이 설정되어 있지 않다고 가정합니다.

  1. 네트워크에서 데이터를 다운로드하여 데이터베이스에 저장하는 인 텐트 서비스를 주기적으로 실행합니다.
  2. 주기적으로 실행되는 동기화 어댑터 구현

위 중 어느 것이 앱에 권장되며 왜 그럴까요?

답변:


12

참고 : 동기화 어댑터는 비동기식으로 실행되므로 데이터를 정기적으로 효율적으로 전송하지만 즉시는 전송하지 않을 것으로 예상해야합니다. 실시간 데이터 전송을 수행해야하는 경우 AsyncTask 또는 IntentService에서 수행해야합니다. - 소스 .

기본적으로 실시간 전송이 필요한 경우 IntentService (첫 번째 옵션), 그렇지 않으면 SyncAdapter를 사용하십시오. IntentService는 더 커스터마이징이 가능하지만 SyncAdapter를 사용하는 것이 더 사소한 접근 방식이기 때문에 선호합니다.


18

어떤 종류의 동기화가 필요한지에 따라 크게 달라집니다.

주기적

앱이 매일 특정 시간에 게시물을 게시하는 뉴스 앱인 경우 (매일 오전 7시 45 분에 말해야 함) 백그라운드 서비스에서 오전 8시에 정기적 인 작업을 실행합니다.

: Drippler. 그들은 매일 한 번 (오후 6시 30 분) 알려줍니다. 나는 그들이 정기적 인 작업을 사용한다고 생각합니다.

이벤트 트리거

사용자 작업으로 데이터 전송이 트리거 된 경우 백그라운드 서비스 또는 AsyncTask를 사용하여 데이터를 전송하십시오.

: DropBox / Evernote. 앱과 상호 작용할 때 동기화됩니다.

동시에 일어나는

앱에서 인스턴트 메시징 / 메일 / 비정기 중요 업데이트를 실행하는 경우 사용자에게 즉시 알리려고 푸시 알림이 필요합니다. 이 경우 GCM 또는 Parse를 사용하십시오. 예 : WhatsApp / Google 채팅 당신이 명시 적으로 사용 GCM 싶지 않아 언급하기 때문에 당신은 왜, 나는 말할 것입니다 한다 대신 자신을 작성하는 표준 푸시 알림 공급자를 사용 :

푸시 알림은 즉시 작동합니다. 지연이 거의 없습니다 (몇 초, 몇 분 정도). 순진한 모델에서이 작업을 수행하기 위해 자체 솔루션 / 라이브러리를 구현하는 경우 상태를 확인하기 위해 1 초 또는 5 초 또는 1 분마다 서버를 ping합니다. CPU (및 배터리), 모바일 대역폭 및 서버로드를 소비하므로 매우 비효율적입니다. 그러나 GCM / Parse에서는 항상 서버에서 포트를 열어 둡니다 ( 여기 참조 ). 이것이 표준적이고 가장 효율적인 방법입니다. 또한 10 개의 앱이 GCM을 사용하는 경우 10 개의 열린 연결이 필요하지 않으며 기기 당 하나만 필요합니다. 그리고 정당한 이유 / 펀드 / 시간이 없다면 자신 만의 솔루션을 개발하고 싶지 않습니다.

동기화 어댑터에 대한 참고 사항 : 동기화 어댑터는 위의 세 가지 경우 모두에 적합합니다. 동기화 어댑터 실행을 확인 하면 GCM 또는 자체 메커니즘 (이벤트 트리거 또는 사용자 지정 솔루션) 또는 네트워크 가용성 (이벤트 트리거) 또는 주기적 이벤트에 따라 달라집니다. 결국, 이것은 매번 긴 초기화 목록을 수행하거나 위의 모든 경우를 한곳에서 구현하지 않고도 데이터를 동기화하는 데 편리한 클래스입니다.


확장 된 질문으로, 경기의 라이브 스코어를 업데이트해야하는 경우, 순간적인 시나리오가이 상황에 적합한가? 일치하는 세부 정보가있는 화면이 있는데 사용자가 해당 화면에있는 동안 점수는 동기화 나 수동 업데이트없이 자동으로 업데이트됩니다. 그렇다면 gcm이 올바른 단계일까요?
gaara87

@AkashRamani이 경우 GCM / Parse를 사용하지 말아야 할 이유가 없습니다. 그러나 GCM은 무료이며 Parse는 특정 시점을 초과하여 요금을 청구합니다. 업데이트가 4096 바이트 내에 있으면 업데이트를 직접 보낼 수 있습니다. 점수 업데이트가 매우 빈번한 경우 폴링은 GCM (크리켓 점수의 경우) 대신 좋은 아이디어 일 수 있습니다. 대기 시간과 CPU / 배터리 소비에 대해 폴링과 GCM을 모두 테스트 / 프로파일 링하는 것이 좋습니다.
Sundeep

AWS에는 플랫폼 간 및 시장 간 알림 솔루션도 있습니다. 참조 : docs.aws.amazon.com/sns/latest/dg/SNSMobilePush.html
Brill

3

SyncAdapter다른 답변에서 언급되지 않은 한 가지 측면이 있습니다 .

SyncAdapter패턴을 사용하려면 동기화 할 특정 ContentProvider 권한과 동기화 할 특정 계정 유형 ( 인증 자 참조 )이 있어야합니다. 따라서 아키텍처에 이러한 구성 요소가없는 경우 (예 : 다른 앱에 데이터에 대한 액세스 권한을 부여하거나 계정을 지원해야 함) SyncAdapter구현에 상당한 오버 헤드가 발생할 수 있습니다.


2

연결과 관련된 데이터 동기화와 관련하여 확장도 가능합니다. 권장되는 방법은 동기화 어댑터를 사용하는 것입니다.

Android traning guide : Sync Adapter 만들기 를 확인하면 그런 식으로 보입니다.

앱의 동기화 어댑터 구성 요소는 장치와 서버간에 데이터를 전송하는 작업에 대한 코드를 캡슐화합니다. 앱에서 제공하는 예약 및 트리거에 따라 동기화 어댑터 프레임 워크는 동기화 어댑터 구성 요소에서 코드를 실행합니다.


2

동기화 어댑터 는 데이터 변경, 경과 시간, 시간 등의 다양한 기준에 따라 데이터 전송을 자동화하므로 실시간 데이터가 필요하지 않은 한 사용해야합니다. 모든 데이터 전송을 중앙 집중화하여 데이터 전송이 다른 앱에서 데이터를 전송하여 배터리 사용을 줄입니다.

즉각적인 작업을 위해

짧은 기간의 작업에 대한 AsyncTask 는 3-4 초일 수 있습니다.

장기 실행 작업을위한 IntentService


엄지 손가락 선택 규칙에 대한 훌륭한 분석.
Brill Pappin

0

디자인에 대해 이야기하고 있으므로 SyncAdapters, SyncResult 객체 및 그 이후의 작업 관리에 대해 언급해야합니다.

실제로 SyncAdapter를 사용하여 라이브러리에 서버에 대한 IntentService 웹 호출을 지시합니다. 이 "동기화"작업 관리는 까다 롭습니다.

내가 지금 취하는 한 가지 접근법은 SyncResult 객체를 완전히 버리고 서비스를 사용하여 각 개별 "Sync"의 결과를 기록하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.