小杜想再来一碗 2022-11-12 09:40 采纳率: 20%
浏览 14
已结题

获取数据一段时间后APP崩溃

socket获取http数据成功一段时间后APP崩溃并报错

写了一类在activity里调用使用

public void MYimportant(){
    new Thread(() -> {
        Log.e("test","打开了main方法");
        new Thread(runnable).start();
        while (!isReceive)
        stringhttp="GET /getSysTime.do HTTP/1.1\r\n" +//请求行
                "Host: quan.suning.com:80\r\n" + "\r\n";//请求头
        new Thread(send).start();
    }).start();
}

Runnable  runnable= () -> {
    Log.e("test","线程runnable已运行");
    try {
        socket= new Socket("quan.suning.com", 80);
        Log.e("text","socket已连接客户端");

    } catch (IOException e) {
        e.printStackTrace();
    }
    isReceive=true;
    Receive receive=null;

    try {
        if(socket!=null){
            receive=new Receive(socket);
            Log.e("test","已把socket写入Receive类进行读取输入流");
        }

    } catch (IOException e) {
        e.printStackTrace();
    }

    if(receive!=null){
        receive.start();
        Log.e("test","开启Receive进行读取");
        System.out.println("----connected success----");
    }

};
Runnable send= new Runnable() {
    @Override
    public void run() {
        Log.e("test","线程send已运行");
        try {
            PrintWriter printWriter = new PrintWriter(socket.getOutputStream(),true);
            printWriter.println(stringhttp);
            Log.e("test","已向服务器发送数据:"+stringhttp);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
};
private class Receive extends Thread{
    private InputStream inputStream;
    Receive(Socket socket) throws IOException {
        Log.e("test","得到输入流");
        inputStream = socket.getInputStream();
    }

    @Override
    public void run() {
        super.run();
        while (isReceive){
            byte[] bytes= new byte[1024];
            try {
                inputStream.read(bytes);
            } catch (IOException e) {
                e.printStackTrace();
            }
            String str= new String(bytes, StandardCharsets.UTF_8).trim();

            Message message = Message.obtain();
            message.obj=str;
            handler.sendMessage(message);
        }
    }
}

@SuppressLint("HandlerLeak")
Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        int i = (msg.obj + "").indexOf("sysTime1");
        time = (msg.obj + "").substring(i + 11, i + 11 + 14);
        Log.e("test", "得到数据:" + msg.obj + "得到时间:" + time);
    }
};

}

错误指向我创建的Handler机制那个位置

img

我的解答思路和尝试过的方法 我尝试过创建一个looper因为我感觉我这个可能个子线程我应该去添加但是我不会
  • 写回答

2条回答 默认 最新

  • 码上就疯 2022-11-12 10:57
    关注

    既然提示你越界了,那你就加一下判断,以下代码只针对你当前的情况

            String str = msg.obj+"";
            Log.d("test", "得到数据:" + str );
            if(str.contains("sysTime1")){//先判断一下包含不包含
                    int i =str.indexOf("sysTime1");
                    if(i+25<=str.length()){//既然你的数据确定了有这么长,那先判断一下
                        time = str.substring(i + 11, i + 11 + 14);
                        Log.d("test", "得到时间:" + time);
                    }
    
            }
           
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月21日
  • 已采纳回答 11月13日
  • 创建了问题 11月12日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装