Android socket runningOnMainThread Error
ringa_lee
ringa_lee 2017-04-17 17:37:53
0
1
597

我有一个长连接心跳包service,每3秒发一次,发的时候没有问题,收服务器的应答时遇到一个诡异的错误。
我是新开了一个thread来运行这个runable,sendMsg()可以发给服务器,也可以打印出Log.d(TAG, "Send HeartBeat");。但是到recvMsg()时,会抛出 InternetRunningOnMainThread异常. 我很困惑,recvMsg和sendMsg不是在同一个thread里运行吗?为什么会有异常?
我的暂时的解决方案是可以在recvMsg再开一个新的thread,这样就没有异常。而且我不用心跳包机制只是单次查询应答的时候没有这个问题。

public void initAndStartHeartBeat(){
    new Thread(new Runnable() {
        @Override
        public void run() {
            if(initSocket()){
                startHeartBeatrunable();
            }
        }
    }).start();
}

private Runnable heartBeatRunnable = new Runnable() {
    @Override
    public void run() {
        if (System.currentTimeMillis() - lastHBSendTime >= HEART_BEAT_RATE && runningHeartBeat) {
            Log.i(TAG, "heartBeatRunnable Thread: " + Thread.currentThread().getId());
            sendMsg(getData2Send());
            Log.d(TAG, "Send HeartBeat");
            recvMsg();
        }
        mHandler.postDelayed(this, HEART_BEAT_RATE);
    }
};
ringa_lee
ringa_lee

ringa_lee

全部回覆(1)
迷茫

延時你用Handler做幹嘛,就算用Handler做你也要開新的LoopThread呀,
你以為Handler是怎麼處理消息的,它依賴的是LoopThread的消息隊列,而默認情況下,只有主線程是LoopThread線程,所以Handler預設會用它去處理訊息,自然你的Runnable就跑到主線程去了。
要嘛你就讓Handler綁開新的LoopThread執行緒​​去做延時,要嘛就用定時器或直接sleep去只延時。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!