Android_happy 2017-07-09 02:53 采纳率: 0%
浏览 863
已结题

andoid for循环里面进行socket请求 接收数据错乱

我的需求是   在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();
        }
    }    

  • 写回答

1条回答 默认 最新

  • dabocaiqq 2018-08-13 08:05
    关注
    评论

报告相同问题?

悬赏问题

  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题
  • ¥15 Python时间序列如何拟合疏系数模型