我的需求是 在for循环里面开socket请求 然后把请求到的数据显示在界面上?
可是现在的问题是 假如集合的长度是2 请求参数走了两次 返回参数只有一次?求大神解答谢谢!
可能是我socket 的创建方式不对 可能的情况是 只接受到最后一条的数据| 我觉得就是接受的输出流错乱了 接受的实例对象 都是最后那次的socket输出流 所以前面的 因为返回的和接受的流对应不上 所以接受不到 ? 那该怎么创建socket对象呢 和 输入输出流对象呢?
我的代码如下
/**
* 请求宝贝的位置信息
*/
@RequiresApi(api = Build.VERSION_CODES.M)
private void setBabyLocationInfo() {
//======请求定位信息============
for (int i = 0; i < watch2List.size(); i++) {
String terminalid = (String) SPUtils.get(this, "cacheId" + i, "");
//如果缓存的id和绑定的id一样 就拿定位信息显示到地图上
if (terminalid.equals(watch2List.get(i).getTerminalid())) {
String userid = watch2List.get(i).getUserid();
String userkey = watch2List.get(i).getUserkey();
String terminalid2 = watch2List.get(i).getTerminalid();
//请求定位信息
connect(userid, userkey, terminalid2, 0);
}
}
}
@RequiresApi(api = Build.VERSION_CODES.M)
public void connect(String userid, String userkey, String terminalid, int flag) {
//请求定位信息
mExecutorService.execute(new ConnectService(userid, userkey, terminalid, flag));
}
private class ConnectService implements Runnable {
String userid;
String userkey;
String terminalid;
int flag;
public ConnectService(String userid, String userkey, String terminalid, int flag) {
this.userid = userid;
this.userkey = userkey;
this.terminalid = terminalid;
this.flag = flag;
}
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void run() {
try {
socket = new Socket(HOST, PORT);
mSink = Okio.buffer(Okio.sink(socket.getOutputStream()));
mSource = Okio.buffer(Okio.source(socket.getInputStream()));
if (flag == 0) {
//历史
requestLsLocationData(userid, userkey, terminalid);
} else {
//最新定位接口
requestNewLocationData(userid, userkey, terminalid);
}
} catch (SocketTimeoutException aa) {
//连接超时 在UI界面显示消息
MyUtils.LogTrace("服务器连接失败!请检查网络是否打开");
} catch (Exception e) {
MyUtils.LogTrace("connectService:" + e.getMessage());
}
}
}
private void receiveMsg() {
try {
while (true) {
// MyUtils.LogTrace("数据长度length:" + mSource.readInt());
int length = mSource.readInt();
String message = mSource.readUtf8(length);
MyUtils.LogTrace("数据长度:" + length + "\n宝贝定位请求数据内容:" + message);
LocationData_SC locationSc = mGson.fromJson(message, LocationData_SC.class);
Message msg = Message.obtain();
msg.obj = locationSc;
msg.what = mTag_4;
mHandler.sendMessage(msg);
}
} catch (SocketTimeoutException aa) {
//连接超时 在UI界面显示消息
MyUtils.LogTrace("服务器连接失败!请检查网络是否打开");
} catch (IOException e) {
MyUtils.LogTrace("receiveMsg:===IOException异常" + e.getMessage());
e.printStackTrace();
}
}