现在在还没有会话的情况下,有两个用户,假设叫甲和乙,甲创建了一个会话,会话包含了一个自定义属性,会话有两个成员,甲和乙。

然后甲发送了一条消息给乙,此时我 debug 了乙方接收消息的 handler 发现,conversation 的 attr 没有值。
然后我在乙的那方手动拉取了服务器的会话,然后再继续用甲发送消息给乙,此时 conversation 的 attr
就有值了。

补充一下:甲创建会话后,在后台已经能看到那个自定义属性了,就是乙接收到的 conversation 没有那个自定义属性。

百思不得其解啊,可能说的有点绕,望大神解答, 谢谢。。

你好,你的意思是第一次创建会话时,发送方本地没有 attr?这带来什么问题?

不好意思,表述不完整,是 接收方 attr 没有值。我需要根据 attr 判断会话是否公开,以便在接收方更新 ui。目前我的解决方法是接收方每次收到一条新的会话,就重新拉取全部会话,这样 attr 就有值了。只不过这种解决方法太暴力。

请贴下发送和接受的代码。

正常来讲,attr 是不需要被强制拉取的。

发送方

conversation.sendMessage(message, AVIMConversation.NONTRANSIENT_MESSAGE_FLAG, new AVIMConversationCallback()//发送消息,当用户不在时会进行推送
{
	@Override
	public void done(AVIMException e)
	{
	if (e == null)
	{
		subscriber.onCompleted();
	} else
	{
		subscriber.onError(e);
	}
}});

接收方的 handler

@Override
	public void onMessage(AVIMMessage message, AVIMConversation conversation, AVIMClient client)
	{
		String clientId;
		clientId = AVImClientManager.getInstance().getClientId();
		if (client.getClientId().equals(clientId))
		{
			if (!message.getFrom().equals(clientId))
			{
				EventBus.getDefault().post(new EventHomeConversationChange(true, conversation));
			}
		}

    }

此时这个 conversation 的 attr 为空。

这是我创建conversation 的代码

HashMap<String, Object> attr = new HashMap<String, Object>();
attr.put(ChatConstant.CHAT_TYPE, chatType);
client.createConversation(members, conversationName, attr, false, true, new
AVIMConversationCreatedCallback()
{
	@Override
	public void done(AVIMConversation avimConversation, AVIMException e)
	{
		if (e == null)
		{
			Logger.e("conversation create success");
			subscriber.onNext(avimConversation);
		} else
		{
			e.printStackTrace();
			subscriber.onError(e);
		}
		}});

再次补充一下,只有当第一次创建会话,发送 message ,接收方的 conversation attr 才会为空。只有当重新拉取后台的 conversation 之后,接收方才能收到 attr。

debug显示:

此时后台的数据

麻烦了。。

你的写法,没看出问题。

请问你的 SDK 版本是多少?我测试最新版 v3.13.2 正常。

就算第一次创建,发送时,attributes 都由 conversation 带过去了。建议 debug 下,发送的时候是不是就没有 attributes,定位下在哪里丢失的。

这个问题会修复吗?