From ed2258208bba6021b771950d859bb2fb0319b988 Mon Sep 17 00:00:00 2001 From: klaus Date: Thu, 6 Nov 2025 16:37:17 +0900 Subject: [PATCH] =?UTF-8?q?fix(live-room):=20=ED=95=98=ED=8A=B8/=EC=BA=94?= =?UTF-8?q?=20=EC=B9=B4=EC=9A=B4=ED=8A=B8=20=EB=8F=99=EC=8B=9C=20=EC=97=85?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EC=8B=9C=20=EC=98=A4=EC=B0=A8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 문제: LiveData.postValue 사용으로 연속 호출 시 병합(coalescing)으로 인해 로스트 업데이트가 발생하여 하트/캔 카운트 누락. 해결: ViewModel에서 메인 스레드 보장 후 setValue(value 할당)로 즉시 갱신하도록 변경. 비메인 스레드 호출 가능성에 대비해 mainHandler로 메인 재호출 처리. 영향: 빠르게 다수의 하트/캔 메시지가 도착해도 각 호출이 정확히 합산되며 오차 제거. 기존 서버 스냅샷 동기화(postValue)는 그대로 유지. --- .../sodalive/live/room/LiveRoomViewModel.kt | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/room/LiveRoomViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/room/LiveRoomViewModel.kt index c888b7cd..c7d3a273 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/live/room/LiveRoomViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/room/LiveRoomViewModel.kt @@ -1,5 +1,6 @@ package kr.co.vividnext.sodalive.live.room +import android.os.Looper import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import com.google.gson.Gson @@ -98,6 +99,9 @@ class LiveRoomViewModel( private val blockedMemberIdList: MutableList = mutableListOf() + // 메인 스레드 보장을 위한 Handler (postValue의 병합(coalescing) 이슈 방지 목적) + private val mainHandler = android.os.Handler(android.os.Looper.getMainLooper()) + fun getUserNickname(memberId: Int): String { for (manager in roomInfoResponse.managerList) { if (manager.id.toInt() == memberId) { @@ -677,11 +681,19 @@ class LiveRoomViewModel( } fun addDonationCan(can: Int) { - _totalDonationCan.postValue(totalDonationCan.value!! + can) + if (Looper.myLooper() == Looper.getMainLooper()) { + _totalDonationCan.value = (_totalDonationCan.value ?: 0) + can + } else { + mainHandler.post { addDonationCan(can) } + } } fun addHeartDonation(heartCount: Int = 1) { - _totalHeartCount.postValue(totalHeartCount.value!! + heartCount) + if (Looper.myLooper() == Looper.getMainLooper()) { + _totalHeartCount.value = (_totalHeartCount.value ?: 0) + heartCount + } else { + mainHandler.post { addHeartDonation(heartCount) } + } } fun donationStatus(roomId: Long, onSuccess: (GetLiveRoomDonationStatusResponse) -> Unit) {