title: 离线功能

本篇文档介绍离线功能的相关特性和具体实现。

离线功能让应用在无网环境下仍可以操作数据。它包括离线事件、监控连接状态等特性。

监听连接状态

/.info/connected 是 Wilddog Sync 提供的一个保留路径,用于存储客户端与云端的连接状态。

例如,监测客户端是否连接到云端:

  1. //初始化
  2. WilddogOptions options = new WilddogOptions.Builder().setSyncUrl("https://<SyncAppID>.wilddogio.com").build();
  3. WilddogApp.initializeApp(options);
  4. //创建一个 SyncReference 实例
  5. SyncReference connectedRef = WilddogSync.getInstance().getReference(".info/connected");
  6. connectedRef.addValueEventListener(new ValueEventListener() {
  7. @Override
  8. public void onDataChange(DataSnapshot dataSnapshot) {
  9. boolean connected = (boolean) dataSnapshot.getValue(Boolean.class);
  10. if (connected) {
  11. System.out.println("connected");
  12. } else {
  13. System.out.println("not connected");
  14. }
  15. }
  16. @Override
  17. public void onCancelled(SyncError syncError) {
  18. }
  19. });

注意:

/.info/connected 的值是 boolean 类型。

离线事件

离线事件是云端与客户端断开连接时自动触发的事件。

断开连接包括客户端主动断开连接,或者意外的网络中断。触发事件即执行特定的数据操作,它支持离线写入,更新和删除数据方法。

onDisconnect() 方法用于在云端与客户端断开连接后执行数据操作。

例如,当用户的网络连接中断时,使用onDisconnect() 方法,记录这个用户已经离线:

  1. //初始化
  2. WilddogOptions options = new WilddogOptions.Builder().setSyncUrl("https://<SyncAppID>.wilddogio.com").build();
  3. WilddogApp.initializeApp(options);
  4. SyncReference presenceRef = WilddogSync.getInstance().getReference("disconnectmessage");
  5. OnDisconnect onDisconnectRef = presenceRef.onDisconnect();
  6. onDisconnectRef.setValue("I disconnected");

通过回调方法判断离线事件是否被云端成功记录:

  1. presenceRef.onDisconnect().removeValue(new SyncReference.CompletionListener() {
  2. @Override
  3. public void onComplete(SyncError error, SyncReference syncReference) {
  4. if (error != null) {
  5. System.out.println("could not establish onDisconnect event:" + error.getMessage());
  6. }
  7. }
  8. });

cancel() 方法用于取消离线事件:

  1. OnDisconnect onDisconnectRef = presenceRef.onDisconnect();
  2. onDisconnectRef.setValue("I disconnected");
  3. onDisconnectRef.cancel();

提示:

通过该 最佳实践,可以保证网络意外中断情况时,离线事件也能成功触发。

手动建立或断开连接

goOnline()goOffline() 方法用于手动建立连接和断开连接。

例如:

  1. // 建立连接
  2. SyncReference presenceRef = WilddogSync.getInstance().getReference();
  3. presenceRef.goOnline();
  4. // 断开连接
  5. SyncReference presenceRef = WilddogSync.getInstance().getReference();
  6. presenceRef.goOffline();

注意:

一个应用可以创建多个 Wilddog Sync 实例,但多个实例只会复用同一个长连接。 并且goOffline()方法 和 goOnline()方法会控制全局的在线和离线。

数据本地持久化

数据本地持久化是针对移动网络稳定性差而开发的功能特性。默认情况下,Wilddog Sync 的数据存储在内存中,一旦重启,内存数据将被清除。开启数据本地持久化功能,可以使设备重启后无需再同步云端。有助于节省流量和提升重启后的访问速度。

数据持久化包含以下两个特性:

特性 说明
离线查询 在无网环境时仍然可以查询数据。
发送离线数据 在无网环境时操作的数据会在重新连接时发送。

setPersistenceEnabled 方法用于开启数据持久化

  1. WilddogSync.setPersistenceEnabled(true)

注意:

必须在创建第一个 Wilddog Sync 实例之前开启持久化。

离线查询

开启数据持久化,Wilddog Sync 会将查询到的数据存储到设备。在无网环境时,应用仍然可以查询之前存储的数据。

例如,有网络时,在 班级示例应用 中查询得分最高的四位学生:

  1. SyncReference scoresRef = WilddogSync.getInstance().getReference("scores");
  2. scoresRef.orderByValue().limitToFirst(4).addChildEventListener(new ChildEventListener() {
  3. @Override
  4. public void onChildAdded(DataSnapshot dataSnapshot, String s) {
  5. Log.d(TAG,"The"+dataSnapshot.getKey()+"student's score is"+dataSnapshot.getValue());
  6. }
  7. @Override
  8. public void onChildChanged(DataSnapshot dataSnapshot, String s) {
  9. }
  10. @Override
  11. public void onChildRemoved(DataSnapshot dataSnapshot) {
  12. }
  13. @Override
  14. public void onChildMoved(DataSnapshot dataSnapshot, String s) {
  15. }
  16. @Override
  17. public void onCancelled(SyncError syncError) {
  18. }
  19. });

然后网络断开,重新启动应用去查询考分最高的两位学生:

  1. SyncReference scoresRef = WilddogSync.getInstance().getReference("scores");
  2. scoresRef.orderByValue().limitToFirst(2).addChildEventListener(new ChildEventListener() {
  3. @Override
  4. public void onChildAdded(DataSnapshot dataSnapshot, String s) {
  5. Log.d(TAG,"The"+dataSnapshot.getKey()+"student's score is"+dataSnapshot.getValue());
  6. }
  7. @Override
  8. public void onChildChanged(DataSnapshot dataSnapshot, String s) {
  9. }
  10. @Override
  11. public void onChildRemoved(DataSnapshot dataSnapshot) {
  12. }
  13. @Override
  14. public void onChildMoved(DataSnapshot dataSnapshot, String s) {
  15. }
  16. @Override
  17. public void onCancelled(SyncError syncError) {
  18. }
  19. });

如上例所示,在离线情况下,仍然成功的查询到了数据。

发送离线数据

开启数据持久化,在无网环境下,应用的所有数据操作都会自动保存,当应用重新连接网络,这些数据将自动发送到云端。