在发送命令的时候首先将请求命令放在一个Vector对象里,然后调用Notify()来唤醒线程。线程在运行的时候首先判断请求Vector对象里是否有内容,如果没有则进入等待状态,如果有内容则调用http连接发送请求。这里注意的地方是,一旦用户登陆成功,那么网络操作层会一直运行,也就是说网络连接是一直在运行的。那么可能有人会有怀疑,如果用户不去发送网络数据,那么手机会不会自动将网络连接断掉。这种情况是存在的,移动QQ其实是开了两个连接线程,一个是Timer对象,使用TimeTask就是每阁一段时间去刷新用户好友的在线状态。
下面以伪代码来说明这些步骤,每个请求都写成了单一的函数,比如说,用户发送消息:
public void sendMsg(String s, String s1)
{
String s2 = null;
s2 = "VER=1.0&CMD=CLTMSG&SEQ=" + iSeqNo++ + "&UIN=" + strUin + "&UN=" + s + "&MG=" + s1;
sendRequest(s2, httpposterlistener);//这个函数的作用是唤醒线程
}
public synchronized void sendRequest(String s)
{
if(iSeqNo == 65535)
iSeqNo = 1;
requestQueue.addElement(s);
notify(); //唤醒 个人感觉还是采用对象锁来处理好点
}
唤醒线程后,会调用下面的函数
private boolean doSend(String s)
httpconnection = (HttpConnection)Connector.open(KQQMIDlet.url, 3, true);
httpconnection.setRequestMethod("POST");
byte abyte0[] = PkgTools.convertUnicode2UTF8Byte(s);
httpconnection.setRequestProperty("Content-Length", "" + abyte0.length);
dataoutputstream = httpconnection.openDataOutputStream();
dataoutputstream.write(abyte0);
dataoutputstream.flush();
这样就是整个网络操作过程,当然它还有个监听网络运行的接口,下次再讲吧^_^(转载请注明出处www.mobilercn.com移动频道,更多内容请访问论坛)