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);