1.1 功能介紹
為了適配網絡傳輸線程和數據處理線程的速度,并且保證所有數據不丟失,使用了緩沖技術。其實質就是建立一個大小合適的哈希表用于存儲數據來模擬隊列先進先出的效果。同時,為了協調讀和寫線程,使用了同步的技術。
1.2 函數介紹
1)向緩沖中增加數據
public synchronized Boolean addBuffer(byte[] data) {
if (data != null) {
if (buffer.size() < volume) {// 確保緩存不會溢出
buffer.put(buffer.size(), data);
return true;
} else {
log.E("%%%%% buffer.size() > volume !!!! %%%%%");
return false;
}
} else {
log.E("%%%%% addBuffer() param is null !!!! %%%%%");
return false;
}
}
紅色標記的synchronized表示同步,即:對于同一段緩沖區,讀和寫操作同一時間只能進行一種,這樣可以保證寫一半的數據被讀取的情況不會出現。
2)從緩沖中讀取數據
public synchronized byte[] getBuffer() {
byte[] data = null;
if (buffer.size() > 0) {
data = buffer.get(buffer.size() - 1);
buffer.remove(buffer.size() - 1);
} else {
log.E("%%%%% readBuffer.size() < 0 !!!! %%%%%");
}
return data;
}
確保只有當緩沖的大小大于0的時候才會讀取數據。
3)向命令緩沖中增加數據
public synchronized Boolean addCmdBuffer(int cmd, int type, int id) {
byte[] cmdd = { (byte) cmd, (byte) type, (byte) id };
if (buffer.size() < volume) {
buffer.put(buffer.size(), cmdd);
return true;
} else {
log.E("%%%%% buffer.size() > volume !!!! %%%%%");
return false;
}
}
增加的命令會被傳遞到主線程,用于實時的處理特殊命令,如:按鈕按下的效果。
{
4)獲得緩存的容量
public synchronized int getVolume() {
return buffer.size();
}
用于獲得緩存的大小,緩存的大小是一個必須要實時監控的數據,溢出有可能造成程序的異常退出。
pthread_exit(0);