PubNub中的聊天消息排序策略

时间:2015-02-11 17:46:24

标签: android time pubnub

我们正在Android中构建聊天应用程序,并且很难确定消息的消息排序策略。现在,我们已经使用设备时间为收到的消息发送消息和服务器时间。如果设备时间与服务器时间不同步,我们意识到这种策略很容易失败。

作为替代方案,我们计划将发送和接收消息的设备时间用于维护正确的排序。为了解决可能错误设置设备时间的情况,如果在发布回调中收到的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();
            }

1 个答案:

答案 0 :(得分:5)

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

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

按照以下基本步骤同步具有独立延迟的设备:

  1. 确定当地时间(以毫秒为单位):start = now()
  2. 加载服务器timetoken:timetoken = http://pubsub.pubnub.com/time/0
  3. 计算timetoken请求的延迟延迟:delay = now() - start
  4. 将服务器timetoken转换为毫秒:timetoken = timetoken/10000
  5. 添加延迟以补偿延迟:message_order_id = timetoken + delay
  6. 使用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!" } });