Smack 中的 Presence getType() 和 isAvailable() 有啥区别?

Posted

技术标签:

【中文标题】Smack 中的 Presence getType() 和 isAvailable() 有啥区别?【英文标题】:What is the difference between Presence getType() and isAvailable() in Smack?Smack 中的 Presence getType() 和 isAvailable() 有什么区别? 【发布时间】:2014-07-07 07:07:45 【问题描述】:

我正在尝试使用 asmack 在我的聊天名单中获取用户的存在。 据我了解, Presece.getType() 应该返回以下存在类型之一:

每个出席信息包都有一个类型,它是以下值之一:

available -- (Default) indicates the user is available to receive messages.
unavailable -- the user is unavailable to receive messages.
subscribe -- request subscription to recipient's presence.
subscribed -- grant subscription to sender's presence.
unsubscribe -- request removal of subscription to sender's presence.
unsubscribed -- grant removal of subscription to sender's presence.
error -- the presence packet contains an error message.

在我的在线用户的存在对象上使用 Presence.getType() 给了我这个:

Log.e("Presence?",myRoster.getPresence(entry.getUser()).getType().toString());

Unavailable

但是,在同一用户上使用 Presence.isAvailable() 会给我:

Log.e("Presence?",Boolean.toString(myRoster.getPresence(entry.getUser()).isAvailable()));

True

根据以下定义,getType() 和 isAvailable() 不应该返回相同的结果吗?

public Presence.Type getType()

返回此出席信息包的类型。

public boolean isAvailable()

如果存在类型可用(在线),则返回 true;如果用户不可用(离线),或者这是订阅操作中涉及的存在数据包,则返回 false。这是一种等效于 getType() == Presence.Type.available 的便捷方法。

我错过了什么?两者有什么区别?

【问题讨论】:

【参考方案1】:

如果你查看源代码,你会发现

public boolean isAvailable() 
    return type == Type.available;    

还有javadoc of isAvailable() 声明

这是一种等效于 getType() == 的便捷方法 Presence.Type.available。

【讨论】:

感谢流。因此,如果 present.isAvailable() 返回 True,则意味着 type = available。但是,同一个存在对象上的存在.getType() 返回“不可用”。我们如何解释这种差异? 可能是因为它不是同一个存在实例。

以上是关于Smack 中的 Presence getType() 和 isAvailable() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

无法访问 discord.js 中的 user.presence.activities

Rails validates_presence_of 并验证 has_one 关联模型中的存在

android中的XMPP连接使用smack

Smack 中的聊天标记 (XEP-0333)

是否可以订阅用户 online_presence 的实时更新?

多用户聊天中的 smack 存在监听器