通过最小分配的处理程序消息传递数组的副本?

Cod*_*ile 1 java optimization multithreading android

我正在后台线程上读取蓝牙数据流,并将该数据传递给UiThread,以便通过消息处理程序进行处理和显示.可在此处找到该过程的更详细描述.

目前我正在读取InputStream byte[]并使用Handler.obtainMessage()来获取带有字节数组作为对象争论的消息.

我遇到了数据包覆盖彼此的问题,因为数组没有跨线程锁定,并且在UiThread可以处理之前在后台被覆盖.显而易见的解决方案是将数组复制到新数组并传递该新对象.

问题是这在Android上非常昂贵,我将获得相当连续的数据流.有没有更好的方法将此数据传递给主UiThread?也许通过同步字节数组或更高效的内存复制方式?

hac*_*bod 5

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