上一篇博文中画出了QuestionsiList的界面,当有用户选择AskQuestion的按钮的时候,系统将为用户创建一个聊天室,聊天室的名字就是用户所提问的问题,并且这个聊天室可以被其他用户在服务器上发现,并加入!
首先当用户点击了AskQuestion的按钮之后,会将用户输入的问题捕获,并且判断这个问题是否已经被其他人提问过,假如该问题已经被其他人提问过的话,我们就将用户加入到该问题创建的聊天室中,用户可以获取其他人对于该问题的回答,也就是该聊天室的聊天记录!否则,会为该问题创建一个新的房间。
创建房间的代码如下:
点击(此处)折叠或打开
- muc = new MultiUserChat(ClientConServer.connection, roomName + "@conference."
-
//这里的room_name就是用户提出的问题,但是有一点要特别注意就是,room_name中是不可以包含空格的所以我们必须对于用户的输入做处理,去掉空格!
-
+ ClientConServer.connection.getServiceName());
-
-
String name = ClientConServer.connection.getUser();//获取创建房间的用户JID
-
System.out.println("name:" + name);
-
muc.create(name);//创建房间,注意这里name仅仅是该用户在房间中的一个昵称,注意此刻这个房间还没有被创建出来
-
System.out.println("before form!!");
-
Form form = muc.getConfigurationForm();//设置房间的一些属性信息
-
Form submitForm = form.createAnswerForm();
-
for(Iterator<FormField> fields = form.getFields(); fields.hasNext();) {
-
FormField field = (FormField) fields.next();
-
if(!FormField.TYPE_HIDDEN.equals(field.getType()) && field.getVariable() != null) {
-
submitForm.setDefaultAnswer(field.getVariable());
-
}
-
}
-
//submitForm.setAnswer("muc#roomconfig_asswordprotectedroom", false);
-
submitForm.setAnswer("muc#roomconfig_roomdesc", message); //设置房间描述信息
-
submitForm.setAnswer("muc#roomconfig_persistentroom", true);//设置房间为永久保留的房间
-
submitForm.setAnswer("muc#roomconfig_enablelogging", true);
-
//submitForm.setAnswer("muc#roomconfig_roomdesc", ClientConServer.connection.getUser() + "'s question");
-
//muc.sendConfigurationForm(new Form(Form.TYPE_SUBMIT));
-
muc.sendConfigurationForm(submitForm);//提交配置信息
-
System.out.println("before join!!!");
-
muc.join(name);//创建者加入房间,房间被创建出来!
- muc.sendMessage("I am coming!");//发送一条消息
点击(此处)折叠或打开
-
class ChatPacketListener implements PacketListener {
-
private String _number;
-
private Date _lastDate;
-
private MultiUserChat _muc;
-
private String _roomName;
-
-
public ChatPacketListener(MultiUserChat muc) {
-
_number = "0";
-
_lastDate = new Date(0);
-
_muc = muc;
-
_roomName = muc.getRoom();
-
}
-
-
@Override
-
public void processPacket(Packet packet) {
-
Message message = (Message) packet;
-
String from = message.getFrom();
-
if (message.getBody() != null) {//这里是通过分析,服务器返回的xml文件中标志来确定这个是否是一条历史消息的
-
DelayInformation inf = (DelayInformation) message.getExtension(
-
"x", "jabber:x:delay");
-
Date sentDate;
-
if (inf != null) {
-
sentDate = inf.getStamp();
-
} else {
-
sentDate = new Date();
-
}
-
android.os.Message msg = new android.os.Message();
-
msg.what = RECIEVE;
-
Bundle bd = new Bundle();
-
bd.putString("date", sentDate.toString());
-
bd.putString("from", from);
-
bd.putString("body", message.getBody());
-
msg.setData(bd);
-
// System.out.println("ddx on 09:55: " + msg.getData().getString("body"));
-
handler.sendMessage(msg);
-
}
-
}
- }
同时为了让我们的界面能够实时的刷新,当接到消息的时候立刻显示在界面上,我们用到了Handler来控制界面的刷新过程!一旦服务器有消息返回,就会被PacketListener监听到,
在PacketListenner中我们向handler发送消息,handler通过消息中定义的标志位RECIEVE来决定是否要刷新界面:
点击(此处)折叠或打开
-
handler = new Handler() {
-
-
@Override
-
public void handleMessage(android.os.Message msg) {
-
// System.out.println("ddx on 10:01: " + msg.getData().getString("body"));
-
-
switch (msg.what) {
-
case 1: {
-
String from = msg.getData().getString("from");
-
String result = msg.getData().getString("body");
-
String date = msg.getData().getString("date");
-
contentTextView.setText( contentTextView.getText() + "\n" + from + " " + date + "\n"+ result);
-
}
-
break;
-
default:
-
break;
-
}
-
}
- };
主界面比较简陋,希望大家不要见怪哦:关于整个工程的源代码可以通过github下载下来,欢迎相互交流:
