managed uma sessão de sincronização - Kotlin SDK
Nesta página
Esta página descreve as sessões de sincronização e como gerenciá-las em um aplicativo usando o Flexible Sync. Para obter informações detalhadas sobre o Flexible Sync, consulte Atlas Device Sync na documentação do App Services.
Sessões de sincronização
Quando você usa o Flexible Sync, o Realm Kotlin SDK sincroniza os dados com o Atlas em segundo plano usando uma sessão de sincronização. A sessão de sincronização começa sempre que você abre um Realm sincronizado.
val app = App.create(YOUR_APP_ID) val user = app.login(credentials) val config = SyncConfiguration.Builder(user, setOf(Task::class)) .build() // Open the synced realm val realm = Realm.open(config) // Sync session is now active // ... do something with the synced realm
A sessão de sincronização managed o seguinte:
Carregar e baixar alterações no Realm
Pausando e retomando a sincronização
Monitoramento da conectividade de rede
Você pode acessar a SyncSession de um único domínio sincronizado por meio da propriedade realm.syncSession .
Estados de conexão versus estados de sessão
O Kotlin SDK managed a comunicação com o App Services em dois níveis:
estado da conexão: o estado da conexão de rede entre um dispositivo cliente e seu aplicativo de backend.
estado da sessão: o estado de sincronização de um único usuário, que pode ser pausado e retomado no SDK à vontade (consulte a seção Pausar e retomar uma sessão de sincronização ).
Ambos os estados determinam se as alterações locais de um usuário são sincronizadas com o backend. A sincronização ocorre somente quando o SyncSession.ConnectionState for CONNECTED
e o SyncSession.State for ACTIVE
ou DYING
.
Aguarde as alterações para fazer upload e download
Para aguardar de forma assíncrona que todas as alterações sejam carregadas no Atlas a partir do seu domínio sincronizado, chame uploadAllLocalChanges. Este método retorna true
quando todas as alterações tiverem sido carregadas.
Para aguardar de forma assíncrona que todas as alterações no Atlas sejam baixadas do servidor do Device Sync para o domínio sincronizado, chame downloadAllServerChanges. Este método retorna true
quando todas as alterações tiverem sido baixadas.
Você também pode incluir um parâmetro timeout
opcional em qualquer um dos métodos para determinar a quantidade máxima de tempo antes de retornar false
. Observe que o upload ou download continua em segundo plano mesmo depois de retornar false
.
O exemplo a seguir demonstra chamar ambos os métodos com um tempo limite definido:
// Wait to download all pending changes from Atlas realm.syncSession.downloadAllServerChanges(1.minutes) // Add data locally realm.write { this.copyToRealm(Task().apply { taskName = "Review proposal" assignee = "Emma" progressMinutes = 0 }) } // Wait for local changes to be uploaded to Atlas realm.syncSession.uploadAllLocalChanges(1.minutes)
Pausar e retomar uma sessão de sincronização
Para pausar a sincronização de uma sessão, ligue para syncSession.pause(). O domínio não sincronizará as alterações com o Atlas enquanto a sessão estiver pausada.
Para retomar a sincronização de uma alteração, ligue para syncSession.resume().
Você deve chamar manualmente syncSession.pause()
e syncSession.resume()
para cada realm cuja sessão de sincronização você deseja pausar e reiniciar. O estado de sincronização de uma sessão não tem impacto em outras sessões abertas.
O seguinte bloco de código demonstra a chamada destes métodos:
// Pause the sync session // Data that you write while session is paused does not sync to Atlas realm.syncSession.pause() // Add data locally realm.write { this.copyToRealm(Task().apply { taskName = "Submit expense report" assignee = "Kevin" progressMinutes = 0 }) } // Resume sync session // Local changes now sync to Atlas realm.syncSession.resume()
Quando pausar uma sessão de sincronização
Para a maioria dos aplicativos, não é necessário pausar e retomar manualmente uma sessão de sincronização. No entanto, existem algumas circunstâncias em que você pode querer pausar ou suspenso uma sessão de sincronização:
Você só quer sincronizar depois que o usuário executar uma ação específica
Você só deseja sincronizar durante um determinado horário do dia
Você não quer tentar sincronizar quando a conectividade de rede estiver ruim
Você deseja forçar explicitamente uma sessão de sincronização para se conectar
No caso de uma conectividade de rede ruim, tentar continuamente estabelecer uma conexão de rede pode esgotar a bateria do dispositivo do usuário.
O caso de forçar explicitamente uma sessão de sincronização para se conectar é mais comumente relacionado a estar offline por algum tempo. O cliente de sincronização tenta se conectar e, em caso de falha, entra em backoff exponencial. After being offline for a long time, the client may not immediately reconnect. Pausar e retomar a sessão de sincronização força explicitamente a conexão.
Ao pausar uma sessão de sincronização, lembre-se do seguinte:
Se o cliente ficar offline por mais tempo do que o tempo máximo offline do cliente , o cliente não conseguirá retomar a sincronização e deverá fazer um reinício do cliente.
Pausar uma sessão de sincronização a pausa em ambas as direções. As alterações feitas pelo seu aplicativo no dispositivo não são sincronizadas com o backend, e as alterações nos dados no backend ou em outros dispositivos não são sincronizadas com o dispositivo. Não há como pausar apenas uploads ou pausar apenas downloads.
Não pause uma sessão de sincronização se quiser que um cliente pare permanentemente de sincronizar com o backend. Para parar permanentemente a sincronização, copie o conteúdo do Realm sincronizado em um Realm não sincronizado e use o Realm não sincronizado no cliente.
Não pause a sincronização para parar a sincronização por períodos indefinidos ou intervalos de tempo em meses e anos. A funcionalidade não foi projetada ou testada para esses casos de uso. Você pode encontrar uma série de problemas ao usá-lo dessa forma.
Monitorar conexão de rede
Você pode obter o estado da conexão de rede atual verificando o SyncSession.connectionState propriedade. Isso retorna um valor de enum ConnectionState que indica o estado da conexão de rede. Os estados possíveis são: CONNECTED
, DISCONNECTED
ou CONNECTING
.
if (realm.syncSession.connectionState == ConnectionState.CONNECTED) { Log.i("Connected to network") // ... do something }
Monitore o estado da conexão de rede com connectionStateAsFlow. Esta propriedade retorna um fluxo de objetos ConnectionStateChange que é atualizado quando a conexão de rede é alterada. Você pode acessar o novo e o antigo ConnectionState
em ConnectionStateChange
.
val connectionFlow = realm.syncSession.connectionStateAsFlow() connectionFlow.collect { ConnectionStateChange -> if (ConnectionStateChange.newState == ConnectionState.CONNECTED) { Log.i("Connected to Atlas Device Sync server") } }
Reconectar manualmente todas as sessões de sincronização
Novidades na versão 1.11.0.
O Realm detecta automaticamente quando um dispositivo recupera a conectividade depois de estar offline e tenta se reconectar usando uma estratégia de backoff incremental.
No Kotlin SDK versão 1.11.0 e posterior, você pode optar por trigger manualmente uma tentativa de reconexão com o App.Sync.reconnect() em vez de esperar pela duração do backoff incremental. Isso é útil se você tiver uma compreensão mais precisa das condições da rede (por exemplo, ao monitorar alterações de rede com o ConnectivityManager
no Android) e não quiser confiar na detecção automática de reconexão do Realm. O SDK também chama automaticamente esse método quando um dispositivo sai do modo avião.
Para trigger manualmente uma tentativa de reconexão, chame o método App.Sync.reconnect() método, que é acessado por meio da interface App.Sync . Ao contrário do SyncSession, que permite acessar uma única sessão de sincronização do domínio, a interface App.Sync
controla todas as sessões de sincronização do seu aplicativo.
app.sync.reconnect()
Quando você chama esse método, o SDK força todas as sessões de sincronização a tentar se reconectar imediatamente e redefine todos os cronômetros usados para backoff incremental.
Importante
Não é possível reconectar dentro da duração do tempo limite de leitura do soquete
O Realm tem um tempo limite de leitura de soquete padrão interno de 2 minutos, onde o Realm atingirá o tempo limite se uma operação de leitura não receber nenhum dado dentro de uma janela de 2 minutos. Se você chamar App.Sync.reconnect()
dentro dessa janela, o Kotlin SDK não tentará se reconectar.