2015-02-11 21 views
2

我们正在Android中构建一个聊天应用程序,并且很难确定消息的消息订购策略。 Uptil现在,我们一直在使用设备时间来发送已接收消息的消息和服务器时间。如果设备时间与服务器时间不同步,我们意识到这种策略会非常容易失败。PubNub中的聊天消息订购策略

作为替代方案,我们计划使用发送和接收消息的设备时间来维护正确的排序。为了说明设备时间可能错误设置的情况,如果Publish回拨中收到的PubNub timetoken与用户的设备时间相距不远,我们计划向用户显示敬酒。下面的代码片段:

这是一个可接受的消息排序策略?有更好的选择。

public void successCallback(String channel, 
             Object message) { 
       if (channel.equals(getUserChannel())) { 

        JSONArray messageDetails = (JSONArray) message; 

        if(messageDetails.length() >2) 
         try { 
          long timeToken = Long.parseLong(messageDetails.getString(2)); 

          timeToken = timeToken/10000; 

          changeMessageStatus(chatMessage.getMobileId(), Status.SENT); 

          long diffValue = timeToken - Calendar.getInstance().getTimeInMillis(); 

          if(Math.abs(diffValue) > Constants.TIME_DIFF_THRESHOLD) 
          { 
           applicationHandler.post(new Runnable() { 
            @Override 
            public void run() { 
             Toast.makeText(getApplicationContext(), getString(R.string.incorrect_time), Toast.LENGTH_SHORT).show(); 
            } 
           }); 

          } 

          Log.d(Constants.TAG,"Diff Time: " + String.valueOf(diffValue)); 

         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 
       } 

       pubnub.unsubscribeAll(); 
      } 
+2

Madhur - 让我知道这个KB是否有帮助。 http://www.pubnub.com/knowledge-base/discussion/195/how-do-i-synchronize-multiple-devices#latest – 2015-02-12 15:44:57

+1

等待时间同步与聊天消息排序。您可以使用PubNub时间同步API为设备获取通用时间同步方法,并将其用作每个独立于时区的设备的时间轴。这实际上会工作得很好! – PubNub 2015-02-12 17:00:38

+0

好主意克雷格! – PubNub 2015-02-12 17:27:33

回答

3

如何在多个时区中的多个设备上订购聊天消息?

PubNub提供了一个time API,可用于在一个毫秒内同步客户端(每个客户端都有自己的延迟)。这可以通过创建所有设备在确认信号后同意前进的最小缓冲时间量(等待时间)来完成。您可以使用此Time Sync API为每条消息创建订单号的。首先,您需要存储客户端增量漂移并计算当前时间。

按照以下基本步骤与独立的延迟同步装置:

  1. 确定本地时间(毫秒):start = now()
  2. 装入服务器timetoken:timetoken = http://pubsub.pubnub.com/time/0
  3. 计算延迟等待时间为timetoken请求:delay = now() - start
  4. 将服务器时间令牌转换为毫秒:timetoken = timetoken/10000
  5. 添加延迟以补偿延迟:message_order_id = timetoken + delay

使用message_order_id所有设备同步火在特定的时钟时间。 message_order_id实质上是您的新的消息OrderID,可用于在屏幕上呈现消息。发布聊天消息时,请将message_order_id作为词典中的条目。

message_order_id = timetoken + delay // new message order id 
pubnub.publish({ message : { order_id : message_order_id, message : "Hi!" } });