看板 AndroidDev 關於我們 聯絡資訊
※ 引述《xezct1213 (xezct)》之銘言: : 大家好,新手發問,請前輩給我意見QQ。 : 問題如題 : 輸入流會不斷丟值 : 例如:556 88 98 98 555 64 87 84 : 其中555是第一個辨識ID,556是第二個辨識ID : 偵測到556這個辨識ID,把接下來的值存入對應陣列 : 偵測到555這個辨識ID,把接下來的值存入對應陣列 : 可以麻煩前輩給我關鍵字搜尋相關應用方法嗎? : 謝謝。 http://pastebin.com/QVb2tM3Z 從程式碼看起來 主要的code就分成五個if (IdCheng = {0,1,2,3,4}) 可以發現裡面都有做一樣的事情 所以可以抽出來減少code的長度 byte[] readBuf = (byte[]) msg.obj; String readMessage = new String(readBuf, 0, msg.arg1); int ConvertMsg = Integer.parseInt(readMessage); 這三行可以從if裡面抽出來 code瞬間少了3*4 = 12行 變成這樣 http://pastebin.com/tcvKLFYi 再來每個if裡面的判斷 皆是在判斷ConvertMsg的值 例如說 if (ConvertMsg == 254) { IdCheng = 2; }else if (ConvertMsg == 253) { IdCheng = 3; }else if (ConvertMsg == 252) { IdCheng = 4; }else { String aaa = readMessage; id1 = (TextView) findViewById(R.id.view_id1); id1.setText(aaa); } 這邊有兩種情況 第一種是ConvertMsg的值只有252,253,254,255四種情形 這種情形就很好解決 (第二種情況就是不只這些值 再做一些處理即可) 可以宣告一個二維陣列 int map[5][4] = { {1,2,3,4}, {1,2,3,4}, {1,2,3,4}, {1,2,3,4}, {1,2,3,4} }; 或是可改成用迴圈來賦值 for(int i=0;i<5;i++){ for(int j=0;j<4;j++){ map[i][j] = j+1; } } 這樣你的code就可以很方便的改寫為 byte[] readBuf = (byte[]) msg.obj; String readMessage = new String(readBuf, 0, msg.arg1); int ConvertMsg = Integer.parseInt(readMessage); int old_IdCheng = IdCheng; IdCheng = map[IdCheng][ConvertMsg-252]; if(old_IdCheng == IdCheng){ String aaa = readMessage; id1 = (TextView) findViewById(R.id.view_id1); id1.setText(aaa); } 以上是比較通用的方法 但是如果妳資料格式真的長這樣的話 連陣列都不需要 因為觀察後可得ConvertMsg + IdCheng = 256 直接把IdCheng = map[IdCheng][ConvertMsg-252] 那行改成 IdCheng = 256-ConvertMsg; 最後的code http://pastebin.com/EgtyGjWY 如果我沒想錯的話 這段code跟你推文中附上的code應該會跑出一樣的結果 (不過我沒測試過不敢保證) 希望沒有理解錯誤 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.34.137.127
xezct1213:感謝Y大回覆,造福我這種菜逼八的新手QQ 02/24 23:35
MetalChao:沒錯, 基本上原原PO的code裡的邏輯可以大幅縮小成Y大寫 02/25 18:54
MetalChao:的這樣, 不過個人覺得跑起來應該會不太一樣 02/25 18:55
MetalChao:第一點是原原PO的邏輯是,如果是252~255是指定接下來要放 02/25 18:56
MetalChao:在哪裡, 然後後面的(非252~255)才是要放進的內容 02/25 18:56
MetalChao:例外: 連續兩個相同的 252~255 的值, 則會被當成資料 02/25 18:57
MetalChao:但Y大的code裡面 old_IdCheng == IdCheng 02/25 18:59
MetalChao:變成只有連續兩個值相同, 才會放進去; 而且有些是資料不 02/25 19:00
MetalChao:是 IdCheng, 也要先判斷, 不能直接減 02/25 19:00
MetalChao:第二點就是最後要放的 view 應該要根據 IdCheng 決定 02/25 19:01
MetalChao:(R.id.view_id1 ~ view_id4) 02/25 19:01
MetalChao:另外建議原PO 把 findViewById() 移出這個 loop/event 02/25 19:02
MetalChao:事先就把 四個 view 準備好, 不然每一個 byte 來就要做 02/25 19:02
MetalChao:一次 findViewbyId(), 效能會很差 02/25 19:03
MetalChao:另外要問原原PO進來的資料是 byte values 還是字串? 02/25 19:03
MetalChao:看應用很像是 byte values, 可是原原PO的code是把它當成 02/25 19:04
MetalChao:字串來轉換, 建議確定一下, 如果真是字串就當我沒說 02/25 19:04
xezct1213:感謝M大的指點,我的描述能力太差讓Y大誤解邏輯真是抱歉 02/25 21:49
xezct1213:這是我目前修正的程式碼,結合Y大與M大的建議 02/25 21:50
xezct1213:http://pastebin.com/dDfSSCvx 02/25 21:50
xezct1213:我是直接使用藍牙聊天室範本修改,進來的資料是 02/25 21:54
xezct1213:Arduino丟進來的byte數值 02/25 21:55
xezct1213:所以說 轉換上建議用byte直接轉換嗎? 02/25 21:56
MetalChao:藍牙Andruino這部份我沒概念, 你所列出的code是訊息接收 02/25 22:25
MetalChao:端, 那麼重點是要看傳訊息的另一端是如何安排資料的; 02/25 22:25
MetalChao:假設傳訊息的一端要送一個byte 0xFF (255), 那麼它是 02/25 22:25
MetalChao:如何傳給你呢? 02/25 22:25
MetalChao:1. 把 0xFF(255), 轉成十進位的 byte array (中間可能還 02/25 22:26
MetalChao: 先轉成string), 變成 byte[] a = { 2, 5, 5 }; 02/25 22:26
MetalChao: 再轉型成 msg.obj 送過來? (看你的 code 很像是這樣 02/25 22:26
MetalChao: 雖然我覺得有點怪, 而且沒效率) 02/25 22:26
MetalChao:2. 傳送端直接把幾個 bytes (如 255, 3, 8) 放進 byte 02/25 22:26
MetalChao: 陣列, 變成 byte[] a = { 255, 3, 8 }; 再轉成 02/25 22:26
MetalChao:msg.obj 送過來 (個人覺得比較合理); 所以你收到的 02/25 22:27
MetalChao:readBuf[] 其實是三個數字(bytes), 而不是表示一個 02/25 22:27
MetalChao: byte 的字串, 但如果真是這樣子, 你現在的 code 就會 02/25 22:28
MetalChao: 有問題. 02/25 22:28
MetalChao:這部份可能你要先確定(傳送端放在 msg.obj 的資料格式) 02/25 22:28
MetalChao:(或是上面是1.還是2.), 才有辦法回答你 02/25 22:28
xezct1213:M大您好,不好意思最近才測試才有辦法回覆 02/27 07:12
xezct1213:目前確定Arduino那邊是您說的第二種方式 02/27 07:13
xezct1213:我現在遇到的問題是手機收到的值為ACSII碼 02/27 07:13
xezct1213:請問我該怎麼使其轉成 byte原始傳來的值? 02/27 07:14
xezct1213:補上伺服器端程式碼 http://pastebin.com/pyu9BTRF 02/27 07:20