Anonymous
SetObserver дублирует представление после выполнения замены
Сообщение
Anonymous » 18 дек 2024, 18:46
Проблема:
есть функция смены положения датчика на другое, но время от времени вид датчика дублируется после успешной замены
дублирование происходит только с представлением, в котором не установлен датчик.
карта датчиков показывает, что датчик имеет значение null после успешной замены, но пользовательский интерфейс не обновился.
дублирование происходит только время от времени, поэтому не могу точно определить, в чем именно причина
чего я достиг, чтобы попытаться устранить проблему:
Я пытался создать логику для принудительного обновления любого датчика, который в данный момент не установлен, но не работал.
попробуйте сбросить датчик при нажатии кнопки. это работает, но только если я нажимаю кнопку (дублирование все равно происходит до того, как я нажимаю кнопку)
выполните rendersensorui, но пользовательский интерфейс, обновляющий все положения датчиков, делает его более уродливым
чего я хочу достичь?:
как вы видите на видео, я хочу, чтобы всегда менял положение и корректно обновлял пользовательский интерфейс. не хочу, чтобы датчик когда-нибудь дублировался(см. видео)
мои мысли:
Я считаю, что основная причина этого — класс наблюдателя. потому что, когда я пытаюсь поставить RemoveObserver после .Observer, дублирование будет происходить всегда, а не время от времени.
это мой код, который, я считаю, является основной причиной этого. есть ли что-то, что я неправильно понимаю?
Код: Выделить всё
private fun setObservers(set: Boolean ) {
Log.e(TAG, "setObservers: set = $set, isObserversRunning = $isObserversRunning, productId = $productId")
if (productId.isNotEmpty()) {
if (set) {
if (!isObserversRunning) {
isObserversRunning = true
Log.e(TAG, "setObservers: proceed")
if (productType == FoboApplication.PRODUCT_TYPE_TIRE) {
inCarViewModel.getInCar(productId)
inCarViewModel.inCar.removeObservers(viewLifecycleOwner)
inCarViewModel.inCar.observe(viewLifecycleOwner) {
when (it.status) {
DataStatus.Status.LOADING -> {
Log.e(TAG, "setObservers: observe loading inCar = ${it.data}")
}
DataStatus.Status.SUCCESS -> {
if (it.data != null) {
Log.e(TAG, "setObservers: observe inCar = ${it.data} for $productId")
if (inCar != it.data) {
inCar = it.data
isSharee = inCar!!.isSharee
if (isSharee) {
if (inCar!!.spareTires.isNullOrEmpty()) {
sensorListener?.onEnablePagerInput(false)
} else {
sensorListener?.onEnablePagerInput(true)
}
}
setName(inCar?.name!!)
resetSensorUI(0, false)
refreshRecPressure(inCar?.pressureSettings!!)
if (sensorMap.isNotEmpty()) {
for (sensor in sensorMap.values) {
if (sensor.bda.isNotEmpty()) {
if (!isRotationInProgress || completedBdaList.contains(sensor.bda)) {
refreshSensor(sensor)
} else {
resetUnknownSensorView(sensor.tirePosition)
}
}
}
if (isInit) {
isInit = false
if (sensorListener != null && sensorListener!!.onCheckInit()) {
sensorListener!!.onCheckPermission(true, false)
}
}
} else if (isInit && isSensorInit && tireCount > 0) {
Log.e(TAG, "setObservers: init from main")
isInit = false
if (sensorListener != null && sensorListener!!.onCheckInit()) {
sensorListener?.onCheckPermission(true, true)
}
}
}
}
}
DataStatus.Status.ERROR -> {
Log.e(TAG, "setObservers: observe inCar error = ${it.data}")
}
}
}
} else if (productType == FoboApplication.PRODUCT_TYPE_BIKE) {
bikeViewModel.getBike(productId)
bikeViewModel.bike.observe(viewLifecycleOwner) {
when (it.status) {
DataStatus.Status.LOADING -> {
Log.e(TAG, "setObservers: observe loading bike = ${it.data}")
}
DataStatus.Status.SUCCESS -> {
if (it.data != null) {
Log.e(TAG, "setObservers: observe bike = ${it.data} for $productId")
if (bike != it.data) {
bike = it.data
isSharee = bike!!.isSharee
setName(bike?.name!!)
resetSensorUI(bike!!.bikeType, true)
if (sensorMap.isNotEmpty()) {
for (sensor in sensorMap.values) {
if (sensor.bda.isNotEmpty()) {
refreshSensor(sensor)
}
}
if (isInit) {
isInit = false
if (sensorListener != null && sensorListener!!.onCheckInit()) {
sensorListener?.onCheckPermission(true, false)
}
}
} else if (isInit && isSensorInit && tireCount > 0) {
Log.e(TAG, "setObservers: init from main")
isInit = false
if (sensorListener != null && sensorListener!!.onCheckInit()) {
sensorListener?.onCheckPermission(true, true)
}
}
}
}
}
DataStatus.Status.ERROR -> {
Log.e(TAG, "setObservers: observe bike error = ${it.data}")
}
}
}
} else if (productType == FoboApplication.PRODUCT_TYPE_WHEELY) {
wheelyViewModel.getWheely(productId)
wheelyViewModel.wheely.observe(viewLifecycleOwner) {
when (it.status) {
DataStatus.Status.LOADING -> {
Log.e(TAG, "setObservers: observe loading wheely = ${it.data}")
}
DataStatus.Status.SUCCESS -> {
if (it.data != null) {
Log.e(TAG, "setObservers: observe wheely = ${it.data} for $productId")
if (wheely != it.data) {
wheely = it.data
isSharee = wheely!!.isCaretaker
setName(wheely?.name!!)
resetSensorUI(wheely!!.type, false)
if (sensorMap.isNotEmpty()) {
for (sensor in sensorMap.values) {
if (sensor.bda.isNotEmpty()) {
refreshSensor(sensor)
}
}
if (isInit) {
isInit = false
if (sensorListener != null && sensorListener!!.onCheckInit()) {
sensorListener?.onCheckPermission(true, false)
}
}
} else if (isInit && isSensorInit && tireCount > 0) {
Log.e(TAG, "setObservers: init from main")
isInit = false
if (sensorListener != null && sensorListener!!.onCheckInit()) {
sensorListener?.onCheckPermission(true, true)
}
}
}
}
}
DataStatus.Status.ERROR -> {
Log.e(TAG, "setObservers: observe wheely error = ${it.data}")
}
}
}
}
sensorViewModel.getProductSensors(productType, productId)
sensorViewModel.productSensorList.removeObservers(viewLifecycleOwner)
sensorViewModel.productSensorList.observe(viewLifecycleOwner) {
when (it.status) {
DataStatus.Status.LOADING -> {
Log.e(TAG, "setObservers: observe loading sensorList = " + it.data + ", size = " + it.data?.size)
}
DataStatus.Status.SUCCESS -> {
isSensorInit = true
if (!it.data.isNullOrEmpty()) {
Log.e(TAG, "setObservers: observe sensorList size = ${it.data.size} for $productId")
tempUnit = UnitConvertHelper.displayTemperatureUnit()
sensorMap = HashMap()
for (sensor in it.data) {
if (sensor.bda.isNotEmpty()) {
sensorMap.put(sensor.tirePosition, sensor)
if (productType == FoboApplication.PRODUCT_TYPE_TIRE) {
if (!isRotationInProgress || completedBdaList.contains(sensor.bda)) {
refreshSensor(sensor)
}
} else {
refreshSensor(sensor)
}
}
}
if (isInit) {
isInit = false
if (sensorListener != null && sensorListener!!.onCheckInit()) {
sensorListener?.onCheckPermission(true, false)
}
}
} else {
Log.e(TAG, "setObservers: observe sensorList empty")
sensorMap = HashMap()
if (isInit && tireCount > 0) {
Log.e(TAG, "setObservers: init from sensor")
isInit = false
if (sensorListener != null && sensorListener!!.onCheckInit()) {
sensorListener?.onCheckPermission(true, true)
}
}
}
}
DataStatus.Status.ERROR -> {
Log.e(TAG, "setObservers: observe sensorList error = ${it.data}")
}
}
}
}
} else {
isObserversRunning = false
Log.e(TAG, "setSensorViewModel: remove")
inCarViewModel.inCar.removeObservers(viewLifecycleOwner)
bikeViewModel.bike.removeObservers(viewLifecycleOwner)
wheelyViewModel.wheely.removeObservers(viewLifecycleOwner)
sensorViewModel.productSensorList.removeObservers(viewLifecycleOwner)
}
}
}
Видео:
https://drive.google.com/file/d/1ckooaV ... sp=sharing
Подробнее здесь:
https://stackoverflow.com/questions/792 ... g-swapping
1734536773
Anonymous
Проблема: [list] [*]есть функция смены положения датчика на другое, но время от времени вид датчика дублируется после успешной замены [*]дублирование происходит только с представлением, в котором не установлен датчик. [*]карта датчиков показывает, что датчик имеет значение null после успешной замены, но пользовательский интерфейс не обновился. [*]дублирование происходит только время от времени, поэтому не могу точно определить, в чем именно причина [/list] чего я достиг, чтобы попытаться устранить проблему: [list] [*]Я пытался создать логику для принудительного обновления любого датчика, который в данный момент не установлен, но не работал. [*]попробуйте сбросить датчик при нажатии кнопки. это работает, но только если я нажимаю кнопку (дублирование все равно происходит до того, как я нажимаю кнопку) [*]выполните rendersensorui, но пользовательский интерфейс, обновляющий все положения датчиков, делает его более уродливым[/list] чего я хочу достичь?: [list] [*]как вы видите на видео, я хочу, чтобы всегда менял положение и корректно обновлял пользовательский интерфейс. не хочу, чтобы датчик когда-нибудь дублировался(см. видео) [/list] мои мысли: [list] [*]Я считаю, что основная причина этого — класс наблюдателя. потому что, когда я пытаюсь поставить RemoveObserver после .Observer, дублирование будет происходить всегда, а не время от времени. [*]это мой код, который, я считаю, является основной причиной этого. есть ли что-то, что я неправильно понимаю? [/list] [code]private fun setObservers(set: Boolean ) { Log.e(TAG, "setObservers: set = $set, isObserversRunning = $isObserversRunning, productId = $productId") if (productId.isNotEmpty()) { if (set) { if (!isObserversRunning) { isObserversRunning = true Log.e(TAG, "setObservers: proceed") if (productType == FoboApplication.PRODUCT_TYPE_TIRE) { inCarViewModel.getInCar(productId) inCarViewModel.inCar.removeObservers(viewLifecycleOwner) inCarViewModel.inCar.observe(viewLifecycleOwner) { when (it.status) { DataStatus.Status.LOADING -> { Log.e(TAG, "setObservers: observe loading inCar = ${it.data}") } DataStatus.Status.SUCCESS -> { if (it.data != null) { Log.e(TAG, "setObservers: observe inCar = ${it.data} for $productId") if (inCar != it.data) { inCar = it.data isSharee = inCar!!.isSharee if (isSharee) { if (inCar!!.spareTires.isNullOrEmpty()) { sensorListener?.onEnablePagerInput(false) } else { sensorListener?.onEnablePagerInput(true) } } setName(inCar?.name!!) resetSensorUI(0, false) refreshRecPressure(inCar?.pressureSettings!!) if (sensorMap.isNotEmpty()) { for (sensor in sensorMap.values) { if (sensor.bda.isNotEmpty()) { if (!isRotationInProgress || completedBdaList.contains(sensor.bda)) { refreshSensor(sensor) } else { resetUnknownSensorView(sensor.tirePosition) } } } if (isInit) { isInit = false if (sensorListener != null && sensorListener!!.onCheckInit()) { sensorListener!!.onCheckPermission(true, false) } } } else if (isInit && isSensorInit && tireCount > 0) { Log.e(TAG, "setObservers: init from main") isInit = false if (sensorListener != null && sensorListener!!.onCheckInit()) { sensorListener?.onCheckPermission(true, true) } } } } } DataStatus.Status.ERROR -> { Log.e(TAG, "setObservers: observe inCar error = ${it.data}") } } } } else if (productType == FoboApplication.PRODUCT_TYPE_BIKE) { bikeViewModel.getBike(productId) bikeViewModel.bike.observe(viewLifecycleOwner) { when (it.status) { DataStatus.Status.LOADING -> { Log.e(TAG, "setObservers: observe loading bike = ${it.data}") } DataStatus.Status.SUCCESS -> { if (it.data != null) { Log.e(TAG, "setObservers: observe bike = ${it.data} for $productId") if (bike != it.data) { bike = it.data isSharee = bike!!.isSharee setName(bike?.name!!) resetSensorUI(bike!!.bikeType, true) if (sensorMap.isNotEmpty()) { for (sensor in sensorMap.values) { if (sensor.bda.isNotEmpty()) { refreshSensor(sensor) } } if (isInit) { isInit = false if (sensorListener != null && sensorListener!!.onCheckInit()) { sensorListener?.onCheckPermission(true, false) } } } else if (isInit && isSensorInit && tireCount > 0) { Log.e(TAG, "setObservers: init from main") isInit = false if (sensorListener != null && sensorListener!!.onCheckInit()) { sensorListener?.onCheckPermission(true, true) } } } } } DataStatus.Status.ERROR -> { Log.e(TAG, "setObservers: observe bike error = ${it.data}") } } } } else if (productType == FoboApplication.PRODUCT_TYPE_WHEELY) { wheelyViewModel.getWheely(productId) wheelyViewModel.wheely.observe(viewLifecycleOwner) { when (it.status) { DataStatus.Status.LOADING -> { Log.e(TAG, "setObservers: observe loading wheely = ${it.data}") } DataStatus.Status.SUCCESS -> { if (it.data != null) { Log.e(TAG, "setObservers: observe wheely = ${it.data} for $productId") if (wheely != it.data) { wheely = it.data isSharee = wheely!!.isCaretaker setName(wheely?.name!!) resetSensorUI(wheely!!.type, false) if (sensorMap.isNotEmpty()) { for (sensor in sensorMap.values) { if (sensor.bda.isNotEmpty()) { refreshSensor(sensor) } } if (isInit) { isInit = false if (sensorListener != null && sensorListener!!.onCheckInit()) { sensorListener?.onCheckPermission(true, false) } } } else if (isInit && isSensorInit && tireCount > 0) { Log.e(TAG, "setObservers: init from main") isInit = false if (sensorListener != null && sensorListener!!.onCheckInit()) { sensorListener?.onCheckPermission(true, true) } } } } } DataStatus.Status.ERROR -> { Log.e(TAG, "setObservers: observe wheely error = ${it.data}") } } } } sensorViewModel.getProductSensors(productType, productId) sensorViewModel.productSensorList.removeObservers(viewLifecycleOwner) sensorViewModel.productSensorList.observe(viewLifecycleOwner) { when (it.status) { DataStatus.Status.LOADING -> { Log.e(TAG, "setObservers: observe loading sensorList = " + it.data + ", size = " + it.data?.size) } DataStatus.Status.SUCCESS -> { isSensorInit = true if (!it.data.isNullOrEmpty()) { Log.e(TAG, "setObservers: observe sensorList size = ${it.data.size} for $productId") tempUnit = UnitConvertHelper.displayTemperatureUnit() sensorMap = HashMap() for (sensor in it.data) { if (sensor.bda.isNotEmpty()) { sensorMap.put(sensor.tirePosition, sensor) if (productType == FoboApplication.PRODUCT_TYPE_TIRE) { if (!isRotationInProgress || completedBdaList.contains(sensor.bda)) { refreshSensor(sensor) } } else { refreshSensor(sensor) } } } if (isInit) { isInit = false if (sensorListener != null && sensorListener!!.onCheckInit()) { sensorListener?.onCheckPermission(true, false) } } } else { Log.e(TAG, "setObservers: observe sensorList empty") sensorMap = HashMap() if (isInit && tireCount > 0) { Log.e(TAG, "setObservers: init from sensor") isInit = false if (sensorListener != null && sensorListener!!.onCheckInit()) { sensorListener?.onCheckPermission(true, true) } } } } DataStatus.Status.ERROR -> { Log.e(TAG, "setObservers: observe sensorList error = ${it.data}") } } } } } else { isObserversRunning = false Log.e(TAG, "setSensorViewModel: remove") inCarViewModel.inCar.removeObservers(viewLifecycleOwner) bikeViewModel.bike.removeObservers(viewLifecycleOwner) wheelyViewModel.wheely.removeObservers(viewLifecycleOwner) sensorViewModel.productSensorList.removeObservers(viewLifecycleOwner) } } } [/code] Видео: https://drive.google.com/file/d/1ckooaVstEDuefqYVxsUsEm0ZoqgvOzaz/view?usp=sharing Подробнее здесь: [url]https://stackoverflow.com/questions/79291698/setobserver-duplicating-view-after-performing-swapping[/url]