fix(live-room): 하트/캔 카운트 동시 업데이트 시 오차 수정
문제: LiveData.postValue 사용으로 연속 호출 시 병합(coalescing)으로 인해 로스트 업데이트가 발생하여 하트/캔 카운트 누락. 해결: ViewModel에서 메인 스레드 보장 후 setValue(value 할당)로 즉시 갱신하도록 변경. 비메인 스레드 호출 가능성에 대비해 mainHandler로 메인 재호출 처리. 영향: 빠르게 다수의 하트/캔 메시지가 도착해도 각 호출이 정확히 합산되며 오차 제거. 기존 서버 스냅샷 동기화(postValue)는 그대로 유지.
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
package kr.co.vividnext.sodalive.live.room
|
package kr.co.vividnext.sodalive.live.room
|
||||||
|
|
||||||
|
import android.os.Looper
|
||||||
import androidx.lifecycle.LiveData
|
import androidx.lifecycle.LiveData
|
||||||
import androidx.lifecycle.MutableLiveData
|
import androidx.lifecycle.MutableLiveData
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
@@ -98,6 +99,9 @@ class LiveRoomViewModel(
|
|||||||
|
|
||||||
private val blockedMemberIdList: MutableList<Long> = mutableListOf()
|
private val blockedMemberIdList: MutableList<Long> = mutableListOf()
|
||||||
|
|
||||||
|
// 메인 스레드 보장을 위한 Handler (postValue의 병합(coalescing) 이슈 방지 목적)
|
||||||
|
private val mainHandler = android.os.Handler(android.os.Looper.getMainLooper())
|
||||||
|
|
||||||
fun getUserNickname(memberId: Int): String {
|
fun getUserNickname(memberId: Int): String {
|
||||||
for (manager in roomInfoResponse.managerList) {
|
for (manager in roomInfoResponse.managerList) {
|
||||||
if (manager.id.toInt() == memberId) {
|
if (manager.id.toInt() == memberId) {
|
||||||
@@ -677,11 +681,19 @@ class LiveRoomViewModel(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun addDonationCan(can: Int) {
|
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) {
|
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) {
|
fun donationStatus(roomId: Long, onSuccess: (GetLiveRoomDonationStatusResponse) -> Unit) {
|
||||||
|
|||||||
Reference in New Issue
Block a user