Cod*_*ile 1 java optimization multithreading android
我正在后台线程上读取蓝牙数据流,并将该数据传递给UiThread,以便通过消息处理程序进行处理和显示.可在此处找到该过程的更详细描述.
目前我正在读取InputStream byte[]
并使用Handler.obtainMessage()来获取带有字节数组作为对象争论的消息.
我遇到了数据包覆盖彼此的问题,因为数组没有跨线程锁定,并且在UiThread可以处理之前在后台被覆盖.显而易见的解决方案是将数组复制到新数组并传递该新对象.
问题是这在Android上非常昂贵,我将获得相当连续的数据流.有没有更好的方法将此数据传递给主UiThread?也许通过同步字节数组或更高效的内存复制方式?
在Android中执行此操作的典型方法是拥有一个已分配对象池.创建这个课程:
class DataBuffer {
DataBuffer next;
byte[] data;
}
Run Code Online (Sandbox Code Playgroud)
你可以像这样管理它们:
final Object mLock = new Object();
DataBuffer mPool;
DataBuffer obtain() {
synchronized (mLock) {
if (mPool != null) {
DataBuffer res = mPool;
mPool = res.next;
return res;
}
return new DataBuffer();
}
}
void recycle(DataBuffer buffer) {
synchronized (mLock) {
buffer.next = mPool;
mPool = buffer;
}
}
Run Code Online (Sandbox Code Playgroud)