在移动端启动socket为防止阻塞需要多线程中进行,但是又需要一个消息机制往外发,如果网络延迟两次请求返回的顺序可能改变了,见下面例子
移动端:(_代码不用细看,我精简了大量的冗余内容_)
//发送登录
public class cLogIn extends Thread {
@Override
public void run() {
outputStream = socket.getOutputStream();
outputStream.write(sDataJson.toString().getBytes());
outputStream.flush();//发出登录请求
}
//接收数据
private class Receive extends Thread{
inputStream = socket.getInputStream();
@Override
public void run() {
while (bSocket){
byte[] buffer = new byte[512];
String str;
try {
inputStream.read(buffer);
str = new String(buffer,"UTF-8").trim();
} catch (IOException e) {
throw new RuntimeException(e);
}
Message message = Message.obtain();
message.what = iRequest;//1 for login;2 for sth else//公共变量
message.obj=str;
handler.sendMessage(message);//向线程外传出数据
}}}
//转收消息
public class MyHandler extends Handler
{
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:{
Log.d("TAG","Login MSG:"+msg.obj);//登录成功!
//更改UI
break;
case 2:
Log.d("TAG","222222");//测试二号
break;
/......
发送一条登录消息,会正常收到消息,一切正常
但是如果我再发送一条查询别的语句,我将消息message.what = iRequest;值改为2,也是可以正常传出来被case 2:分拣到;
但是我总觉很怪异!Android就是这样工作的?
如果我快速发送十种不同的请求,这些消息总会因网络延迟而“串线”吧?!