簡體   English   中英

循環中不活動的計時器

[英]Timer for inactivity during a loop

我正在編寫一個連接到藍牙設備的應用程序,然后發送消息並獲得答案。 這是我用來獲取答案的代碼:

    StringBuilder res = new StringBuilder();
    while ((char) (b = (byte) in.read()) != '>') {
        if ((char) b != ' ') {
            res.append((char) b);
        }
    }
    rawData = res.toString().trim();

基本上,它將每個字符一個接一個地添加到StringBuilder中

當有答案時,沒問題,就可以了。 但是問題在於設備沒有任何答案(因為無論如何連接都斷開了)。

如何限制等待角色的時間?

編輯:

這是我的藍牙連接

final BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
    _dev = btAdapter.getRemoteDevice(remoteDevice);
    try {

        Method m;
        m = _dev.getClass().getMethod("createRfcommSocket", new Class[] { int.class });
        _sock = (BluetoothSocket) m.invoke(_dev, 1);
        _sock.connect();
        setState(STATE_CONNECTED);
        sockIn = _sock.getInputStream();
        sockOut = _sock.getOutputStream();

    } catch (Exception e) {
        closeConnection();
    }

使用InputStream的“可用”方法

InputStream的參考頁

在讀取之前檢查流中是否有數據而沒有阻塞,並檢查兩次讀取之間的經過時間,以確定是否發生超時(System.getCurrentTimeMillis()應該完成此工作)。

檢查此答案以供參考和完整列表:

在Android的BluetoothSocket inputstream.read()中實現超時

編輯:

如果我正確地閱讀了您的評論的兩行之間,則可以使用藍牙UDP套接字...

可悲的 ,您似乎無法在Android上通過藍牙使用數據報,因此必須堅持使用TCP。

如果您要在設備之間發送的數據是事件驅動的(例如,您希望設備A上的用戶在設備B上的用戶觸摸屏幕/發射武器等后立即收到通知),您仍然可以調整閱讀循環做你想做的。

您所需要的就是一個工作線程,在該線程中,使循環執行I / O繁重的工作,以及一個處理程序(在UI線程中創建該處理程序),該處理程序將在收到任何內容后立即通知您的選擇。

請記住,我只是在猜測您的使用情況,因此,如果異步事件驅動的通信不是問題,請不要誤導。

希望這可以幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM