V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
QBugHunter
V2EX  ›  Android

关于循环中使用 Thread.Sleep()函数

  •  
  •   QBugHunter · 2020-12-09 16:03:50 +08:00 · 11106 次点击
    这是一个创建于 1434 天前的主题,其中的信息可能已经有所发展或是发生改变。

    首先 APP 需要开启一个线程,这个线程需要长时间的运行以便和设备连接,这个线程的 run 有个无限循环,确保该线程和设备一直有交互,因为设备上报消息的时间是完全随机的

    有以下两种情况需要在线程里(也就是那个无线循环里)使用 Sleep()函数

    一种情况是,某个信号触发,线程需要里全部设备发送几条消息

    for(String ip : deviceIPList){
        TcpSocket.getInstance().sendMsg(ip,msg1);
        Thread.Sleep(SLEEP_INTERVAL);
        TcpSocket.getInstance().sendMsg(ip,msg2);
        Thread.Sleep(SLEEP_INTERVAL);
        TcpSocket.getInstance().sendMsg(ip,msg3);
    }
    

    因为实际测试,手机发送消息的间隔和设备处理消息最小间隔至少差了一个数量级,这 3 条消息我每发一条消息就 Sleep()一次,确保设备能够有足够时间处理上一条消息。

    另一种情况是等待设备的反馈,设备处理某些事务可能需要花费一定时间,根据事务不同,可能是 100 毫秒,也可能需要 2 到 3 分钟,代码类似这样

    TcpSocket.getInstance().sendMsg(deviceIPList.get(0),requestMsg);
    while(!hasGetResult)
        Thread.Sleep(SLEEP_INTERVAL);
    

    设备可能 100 毫秒后,也可能 2 分钟后,会发送消息,APP 收到消息后把 hasGetResult 置为 true,然后循环 Sleep 结束

    以上两段代码都在循环中使用了 Sleep(),而实际情况是这两段代码在一个更大的循环中(线程的 run()里面就是一个巨大的无限循环),而 Android Studio4.1 提示

    call "Thread.Sleep()" in a loop,probably busy-waiting

    我向问下,对于这两种情况,有没有更好的解决版本(不用 Sleep()),如果没有更好的办法,又如何在单独的文件里取消这个 warnning

    2 条回复    2020-12-16 09:41:32 +08:00
    ai277014717
        1
    ai277014717  
       2020-12-09 16:40:56 +08:00
    用现成的 eventloop 框架。或者在 lint 中关闭对应的规则就好了。
    zuoyuan333
        2
    zuoyuan333  
       2020-12-16 09:41:32 +08:00
    用 handler 做吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3495 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 04:58 · PVG 12:58 · LAX 20:58 · JFK 23:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.