Когда наблюдатель запрашивает данные в реальном времени? - PullRequest
1 голос
/ 01 мая 2020

У меня есть модель представления, которая обрабатывает массив байтов в несколько сложный массив с плавающей точкой. Часть данных - это временная метка, которую я установил как тип LiveData, и наблюдатель прослушивает изменения в временной метке. Когда происходит изменение, он получает новую временную метку, а также получает массив с плавающей точкой.

Мой вопрос заключается в том, когда в объекте LiveData установлено «значение», вызывается ли наблюдатель немедленно или он ожидает окружения функция для завершения? Другими словами, должен ли я обязательно обновлять любые другие данные, к которым имеет доступ наблюдатель, прежде чем устанавливать «значение»?

Кроме того, это злоупотребляет механизмом LiveData (используя его в качестве флага для большего изменения данных) )?

  val mTime = MutableLiveData<Double>()
  var mStateDataSet = ArrayList<ArrayList<Float>>()

  fun updateData(rawData: ByteArray) {

    val buffer = ByteBuffer.wrap(rawData).order(ByteOrder.LITTLE_ENDIAN)

    val min = (buffer.getInt(4)).toDouble()
    val usec = (buffer.getInt(8)).toDouble()

    val time: Double = min * 60.0 + usec * (1.0 / 1e6)

    // Update the live data....
    mTime.value = time

    // This data is used by the observer of "mTime"
    mStateDataSet[KEY_VOLTAGES] = getSubDataFloat(buffer, NUM_VOLTAGE);
    mStateDataSet[KEY_PRESSURES] = getSubDataFloat(buffer, NUM_PRESSURE);
    mStateDataSet[KEY_LEFT_ANGLES] = getSubDataFloat(buffer, NUM_LEFT_ANGLES);
    mStateDataSet[KEY_RIGHT_ANGLES] = getSubDataFloat(buffer, NUM_RIGHT_ANGLES);
    mStateDataSet[KEY_LEFT_ACCEL] = getSubDataFloat(buffer, NUM_LEFT_ACCEL);
    mStateDataSet[KEY_RIGHT_ACCEL] = getSubDataFloat(buffer, NUM_RIGHT_ACCEL);
    mStateDataSet[KEY_DEBUG] = getSubDataFloat(buffer, NUM_DEBUG);

  }

// Example observer from one of my fragments
    val timeObserver = Observer<Double> { newTime ->
      addDataPoint(mSharedStateDataViewModel.mStateDataSet, newTime)
    }
    mSharedStateDataViewModel.mTime.observe(viewLifecycleOwner, timeObserver)

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Вы должны обновить значение жизненных данных с помощью

mTime.postValue(time)

Кроме того, Tenfour04 комментарий

postValue приведет к вызову наблюдателей после эта функция возвращает. setValue приводит к вызову наблюдателей до возврата setValue, то есть до остального кода в этой функции.

0 голосов
/ 01 мая 2020

Учитывая, что состояние LifeCycleOwner (ie. Activity, Fragment) наблюдателя составляет не менее STARTED , и вы используете setValue method, Observer будет немедленно уведомлено.

В вашем случае, когда вы делаете mTime.value = time, это немедленно сообщит ассоциированному Observer, обратите внимание, что если у вас есть несколько Наблюдателей на одном LiveData object, тогда может потребоваться некоторое время, чтобы проинформировать их всех, и может быть значительная задержка между уведомлениями для двух разных наблюдателей.

Если, однако, вы используете postValue в своем примере, тогда Observer будет уведомлено после включения метод заканчивается.

...