SetObserver дублирует представление после выполнения заменыAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 SetObserver дублирует представление после выполнения замены

Сообщение Anonymous »

Проблема:
  • есть функция смены положения датчика на другое, но время от времени вид датчика дублируется после успешной замены
  • дублирование происходит только с представлением, в котором не установлен датчик.
  • карта датчиков показывает, что датчик имеет значение 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»