Chinaunix首页 | 论坛 | 博客
  • 博客访问: 622437
  • 博文数量: 79
  • 博客积分: 848
  • 博客等级: 军士长
  • 技术积分: 1800
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-26 19:30
文章分类

全部博文(79)

文章存档

2015年(4)

2013年(39)

2012年(36)

分类: Android平台

2013-08-15 15:01:05

下面到了我们这个应用的聊天界面,其实界面的布局神马的简直是弱爆了,我也就不多说了,这里主要说明一下如何将自己发送的消息和从别人那边接收到的消息,显示到界面上!
上一篇博文中画出了QuestionsiList的界面,当有用户选择AskQuestion的按钮的时候,系统将为用户创建一个聊天室,聊天室的名字就是用户所提问的问题,并且这个聊天室可以被其他用户在服务器上发现,并加入!

首先当用户点击了AskQuestion的按钮之后,会将用户输入的问题捕获,并且判断这个问题是否已经被其他人提问过,假如该问题已经被其他人提问过的话,我们就将用户加入到该问题创建的聊天室中,用户可以获取其他人对于该问题的回答,也就是该聊天室的聊天记录!否则,会为该问题创建一个新的房间。

创建房间的代码如下:

点击(此处)折叠或打开

  1. muc = new MultiUserChat(ClientConServer.connection, roomName + "@conference."
  2. //这里的room_name就是用户提出的问题,但是有一点要特别注意就是,room_name中是不可以包含空格的所以我们必须对于用户的输入做处理,去掉空格!
  3.                         + ClientConServer.connection.getServiceName());
  4.                
  5.                 String name = ClientConServer.connection.getUser();//获取创建房间的用户JID
  6.                 System.out.println("name:" + name);
  7.                 muc.create(name);//创建房间,注意这里name仅仅是该用户在房间中的一个昵称,注意此刻这个房间还没有被创建出来
  8.                 System.out.println("before form!!");
  9.                 Form form = muc.getConfigurationForm();//设置房间的一些属性信息
  10.          Form submitForm = form.createAnswerForm();
  11.           for(Iterator<FormField> fields = form.getFields(); fields.hasNext();) {
  12.      FormField field = (FormField) fields.next();
  13.      if(!FormField.TYPE_HIDDEN.equals(field.getType()) && field.getVariable() != null) {
  14.      submitForm.setDefaultAnswer(field.getVariable());
  15.      }
  16.      }
  17.           //submitForm.setAnswer("muc#roomconfig_asswordprotectedroom", false);
  18.      submitForm.setAnswer("muc#roomconfig_roomdesc", message); //设置房间描述信息
  19.           submitForm.setAnswer("muc#roomconfig_persistentroom", true);//设置房间为永久保留的房间
  20.           submitForm.setAnswer("muc#roomconfig_enablelogging", true);
  21.           //submitForm.setAnswer("muc#roomconfig_roomdesc", ClientConServer.connection.getUser() + "'s question");
  22.          //muc.sendConfigurationForm(new Form(Form.TYPE_SUBMIT));
  23.           muc.sendConfigurationForm(submitForm);//提交配置信息
  24.           System.out.println("before join!!!");
  25.           muc.join(name);//创建者加入房间,房间被创建出来!
  26.           muc.sendMessage("I am coming!");//发送一条消息
为了能够捕获,服务器返回的消息,我们必须为该MUC创建一个监听程序,这里我实现了一个自己的消息监听程序,用来判断这条消息是历史消息还是,新的消息:

点击(此处)折叠或打开

  1. class ChatPacketListener implements PacketListener {
  2.         private String _number;
  3.         private Date _lastDate;
  4.         private MultiUserChat _muc;
  5.         private String _roomName;

  6.         public ChatPacketListener(MultiUserChat muc) {
  7.             _number = "0";
  8.             _lastDate = new Date(0);
  9.             _muc = muc;
  10.             _roomName = muc.getRoom();
  11.         }

  12.         @Override
  13.         public void processPacket(Packet packet) {
  14.             Message message = (Message) packet;
  15.             String from = message.getFrom();
  16.             if (message.getBody() != null) {//这里是通过分析,服务器返回的xml文件中标志来确定这个是否是一条历史消息的
  17.                 DelayInformation inf = (DelayInformation) message.getExtension(
  18.                         "x", "jabber:x:delay");
  19.                 Date sentDate;
  20.                 if (inf != null) {
  21.                     sentDate = inf.getStamp();
  22.                 } else {
  23.                     sentDate = new Date();
  24.                 }
  25.                 android.os.Message msg = new android.os.Message();
  26.                 msg.what = RECIEVE;
  27.                 Bundle bd = new Bundle();
  28.                 bd.putString("date", sentDate.toString());
  29.                 bd.putString("from", from);
  30.                 bd.putString("body", message.getBody());
  31.                 msg.setData(bd);
  32.                // System.out.println("ddx on 09:55: " + msg.getData().getString("body"));
  33.                 handler.sendMessage(msg);
  34.             }
  35.         }
  36.     }
上面我们自己定义的ChatPacketListener继承了XMPP中定义PacketListener,该类实际上启动了一个单独的线程用来监听服务器返回的消息。
同时为了让我们的界面能够实时的刷新,当接到消息的时候立刻显示在界面上,我们用到了Handler来控制界面的刷新过程!一旦服务器有消息返回,就会被PacketListener监听到,
在PacketListenner中我们向handler发送消息,handler通过消息中定义的标志位RECIEVE来决定是否要刷新界面:

点击(此处)折叠或打开

  1. handler = new Handler() {

  2.      @Override
  3.      public void handleMessage(android.os.Message msg) {
  4.                // System.out.println("ddx on 10:01: " + msg.getData().getString("body"));
  5.                 
  6.      switch (msg.what) {
  7.      case 1: {
  8.      String from = msg.getData().getString("from");
  9.      String result = msg.getData().getString("body");
  10.      String date = msg.getData().getString("date");
  11.      contentTextView.setText( contentTextView.getText() + "\n" + from + " " + date + "\n"+ result);
  12.      }
  13.      break;
  14.      default:
  15.      break;
  16.      }
  17.      }
  18.      };
经过这一系列的活动,我们就可以得到一个简易的实时在线的解答系统了:
主界面比较简陋,希望大家不要见怪哦:关于整个工程的源代码可以通过github下载下来,欢迎相互交流:


阅读(6129) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

CU博客助理2013-10-10 11:15:51

嘉宾点评:三篇都是同一个系列,所以统一点评如下:
这一系列文章(包括之前的《有关于XMPP协议的一些总结 》)是非常不错的XMPP实时通信协议实践笔记,从知识介绍、代码到实践一应俱全,内容、条理清晰,并开放源码给大家实践,非常值得赞赏的开源精神。在完成了这样的总结后,相信作者对于XMPP协议应用会有一定的实践经验。这是一篇非常不错的实践教材,绝对值得推荐。建议最好对代码稍做解析,并注意排版,能配有图片介绍软件原理和通信过程就更好了。(感谢您参与“原创博文评选”获奖结果即将公布)