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
    关注
    评论

报告相同问题?

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮