bmob查询结果如何用全局变量接收怎么通过handler+message实现

2025-04-13 21:16:26
推荐回答(1个)
回答1:

可以下个demo看看
1、 开启私聊
//如果需要更新用户资料,开发者只需要传新的info进去就可以了
BmobIM.getInstance().startPrivateConversation(BmobImUserInfo info, new ConversationListener() {
@Override
public void done(BmobIMConversation c, BmobException e) {
if(e==null){
//在此跳转到聊天页面
Bundle bundle = new Bundle();
bundle.putSerializable("c", c);
startActivity(ChatActivity.class, bundle, false);
}else{
toast(e.getMessage()+"("+e.getErrorCode()+")");
}
}
});

2、 创建会话实例
使用BmobIMConversation.obtain(BmobIMClient client,BmobIMConversation conversation)方法传入BmobIMClient和BmobIMConversation的各自实例就可以创建一个用于控制消息查询、发送和删除的会话实例。
BmobIMConversation c;
//在聊天页面的onCreate方法中,通过如下方法创建新的会话实例,这个obtain方法才是真正创建一个管理消息发送的会话
c=BmobIMConversation.obtain(BmobIMClient.getInstance(),(BmobIMConversation)getBundle().getSerializable("c"));

创建完成后,就可以使用这个会话实例c对消息进行各种操作啦,以下操作中的c都指的是该会话实例。
注:如果不调用BmobIMConversation的obtain方法是无法控制消息发送等操作的,会报client disconnect的错误。
查询聊天记录
//首次加载,可设置msg为null,
//下拉刷新的时候,可用消息表的第一个msg作为刷新的起始时间点,默认按照消息时间的降序排列,limit由开发者控制
c.queryMessages(msg, limit, new MessagesQueryListener() {
@Override
public void done(List list, BmobException e) {
sw_refresh.setRefreshing(false);
if (e == null) {
if (null != list && list.size() > 0) {
adapter.addMessages(list);
adapter.notifyDataSetChanged();
layoutManager.scrollToPositionWithOffset(list.size() - 1, 0);
}
} else {
toast(e.getMessage() + "(" + e.getErrorCode() + ")");
}
}
});

删除聊天记录
删除消息不同于删除会话,会直接清空本地的消息记录数据。
//删除指定聊天消息
c.deleteMessage(BmobIMMessage msg)

//删除一条或多条聊天消息
c.deleteBatchMessage(List msgs)

//清空该会话下的聊天消息,允许保留会话(可选)
c.clearMessage(boolean isKeepConversion,MessageListener listener)

注:isKeepConversion 表示是否保留该会话消息。

更新指定会话的所有消息为已读状态
可以在ChatActivity的聊天页面的onDestory方法中调用如下方法更新该会话的的所有消息为已读状态:
//更新此会话的所有消息为已读状态
c.updateLocalCache();

消息发送
文本消息
文本消息可以是纯文本,也可以是包含表情的文本消息,通过BmobIMTextMessage的setContent方法设置内容来构建BmobIMTextMessage实例,再调用BmobIMConversation的sendMessage方法发送。
BmobIMTextMessage msg =new BmobIMTextMessage();
msg.setContent(text);
//可随意设置额外信息
Map map =new HashMap<>();
map.put("level", "1");
msg.setExtraMap(map);
c.sendMessage(msg, new MessageSendListener() {
@Override
public void onStart(BmobIMMessage msg) {
super.onStart(msg);
scrollToBottom();
adapter.addMessage(msg);
adapter.notifyDataSetChanged();
}

@Override
public void done(BmobIMMessage msg, BmobException e) {
scrollToBottom();
adapter.notifyDataSetChanged();
edit_msg.setText("");
if (e != null) {
toast(e.getMessage());
}
}
});

图像消息
图片可以是通过系统拍照或本地相册中获取的本地图片地址,也可以使用网络上某个有效的图片地址。然后构造一个BmobIMImageMessage对象,再调用BmobIMConversation的sendMessage方法发送。
发送本地图片
使用系统拍照功能或从本地相册中获取到本地图片地址(localPath),然后调用构造方法BmobIMImageMessage(String localPath)来创建BmobIMImageMessage实例。
BmobIMImageMessage image =new BmobIMImageMessage(localPath);
c.sendMessage(image, new MessageSendListener() {

@Override
public void onProgress(int value) {
super.onProgress(value);
//文件类型的消息才有进度值:do something
Logger.i("onProgress:"+value);
}

@Override
public void onStart(BmobIMMessage msg) {
scrollToBottom();
adapter.addMessage(msg);
adapter.notifyDataSetChanged();
}

@Override
public void done(BmobIMMessage msg, BmobException e) {
scrollToBottom();
adapter.notifyDataSetChanged();
edit_msg.setText("");
if (e != null) {
toast(e.getMessage());
}
}
});