저라면 먼저 데이터를 추가하는 부분과 읽어서 처리하는 부분이 데이터를 공유하지 않도록 변경할 것 같습니다.
class SerialDataReceiver: SerialInputOutputManager.Listener {
interface Listener {
fun onReceive(data: ByteArray)
}
private val listeners = hashSetOf<SerialDataReceiver.Listener>()
fun registerListener(listener: SerialInputOut.Listener) {
listeners.add(listener)
}
fun unregisterListener(listener: SerialDataReceiver.Listener) {
val iterator = listeners.iterator()
while (iterator.hasNext()) {
val nextListener = iterator.next()
if (nextListener == listener) {
iterator.remove()
}
}
}
override fun onNewData(data: ByteArray) {
for (listener in listeners) {
listener.onReceive(data)
}
}
}
open class BaseSprayActivity : BaseActivity(), SerialDataReceiver.Listener {
private val serialDataReceiver = SerialDataReceiver()
@Override
fun onResume() {
super.onResume()
serialDataReceiver.registerListener(this)
}
@Override
fun onStop(...) {
super.onStop(...)
serialDataReceiver.unregisterListener(this)
}
override fun onReceive(data: ByteArray) {
// 필요한 처리
}
}
만약 위처럼 변수를 공유하지 않고 콜백 내에서 처리하기 곤란하다면, thread 에 안전한 ArrayBlockingQueue나 LinkedBlockginQueue 등과 같은 클래스를 사용하시는 게 나을 듯 합니다.