非独立模式(先登录IM,再直接进入聊天室)
进入聊天室API原型 @param roomData 聊天室基本数据(聊天室ID必填)
@param retryCount 如果进入失败,重试次数
@return InvocationFuture 可以设置回调函数。回调中返回聊天室基本信息
AbortableFuture<EnterChatRoomResultData> enterChatRoomEx(EnterChatRoomData roomData, int retryCount);
val status = NIMClient.getStatus()
if (status == StatusCode.UNLOGIN) {
NIMClient.getService(AuthServiceObserver::class.java)
.observeOnlineStatus(observeLoginStatus, true)
LoginUtils.getInStance().autoLogin2()
return
}
NIMClient.getService(ChatRoomService::class.java)
.enterChatRoomEx(EnterChatRoomData(chatRoomId), 1)
.setCallback(object : RequestCallback<EnterChatRoomResultData> {
override fun onSuccess(param: EnterChatRoomResultData) {
observerMessage()
mMessageCallback?.enterRoomOnSuccess(param)
}
override fun onFailed(code: Int) {
mMessageCallback?.enterRoomOnFailed(code)
}
override fun onException(exception: Throwable) {
mMessageCallback?.enterRoomOnException(exception)
}
})
接收消息API原型
/**
* 注册/注销消息接收观察者。
*
* @param observer 观察者,参数为收到的消息集合
* @param register true为注册,false为注销
*/
public void observeReceiveMessage(Observer<List<ChatRoomMessage>> observer, boolean register);
代码示例
/**
* 消息监听
*/
private fun observerMessage() {
NIMClient.getService(ChatRoomServiceObserver::class.java).observeReceiveMessage(
incomingChatRoomMessage, true)
}
private val incomingChatRoomMessage by lazy {
object : Observer<List<ChatRoomMessage>> {
override fun onEvent(t: List<ChatRoomMessage>?) {
mMessageCallback?.observerMessage(t as MutableList<ChatRoomMessage>)
}
}
}
查询历史消息
limit:限制查询的历史消息数量(最多一百条)
startTime:锚点
/**
* 获取历史消息,可选择给定时间往前或者往后查询,若方向往前,则结果排序按时间逆序,反之则结果排序按时间顺序。
*
* @return InvocationFuture 可以设置回调函数。回调中返回历史消息列表
*/
InvocationFuture<List<ChatRoomMessage>> pullMessageHistoryEx(String roomId, long startTime, int limit, QueryDirectionEnum direction);
代码示例
拉取的消息限制在十二小时以内,云信一次最多只能拉取一百条数据
想要拉取十二小时之内的所有消息,不限制一百条的话可以在拉取消息成功的回调里
做一个判断,当拉取的消息有一百条并且最后一条消息的时间戳在十二小时之内,说明还有消息要
拉取,再调取一次拉取历史消息的方法,通过一个ArrayList把每一次拉取的消息拼接起来
从现在的时间戳往前拉取得到的ArrayList是反的,需要进行一次反转
Collections.reverse(message)
fun getHistoryMessage(time: Long) {
NIMClient.getService(ChatRoomService::class.java)
.pullMessageHistoryEx(mChatRoomId, time, limitCounts,
QueryDirectionEnum.QUERY_OLD)
.setCallback(chatRoomCallback)
}
private val chatRoomCallback = object : RequestCallbackWrapper<List<ChatRoomMessage>>()
{
override fun onResult(code: Int, result: List<ChatRoomMessage>?,
exception: Throwable?) {
if (result != null) {
for (item in result) {
mHistroyMessageList?.add(item)
}
if (result.size == 100 && result.get(result.size - 1).time >
System.currentTimeMillis() - 12 * 60 * 60 * 1000){
getHistoryMessage(result.get(result.size-1).time)
}else{
mProxyView.handlerHistoryMessage(code, mHistroyMessageList)
}
}
}
}