关于使用'liveData.observe'的问题

问题描述 投票:0回答:1

我正在独自学习Android开发。我以为我已经了解了“ liveData.observe”的工作方式。但是...

[制作一个小型的简单应用程序,用于侦听来自蓝牙设备的输入,并将基于该蓝牙输入显示或隐藏图像。

我已经完成了所有工作,但是现在我想添加另一个功能,并且遇到了麻烦。该功能是每次liveData.Observe返回TRUE时都增加一个计数器。

要么我不理解'liveData.observe',要么我尝试不正确地使用它(可能是这两种情况。

我现在正在研究增加该计数器的功能,这就是我一直挂在这里的地方。我目前的想法是创建一个单独的函数(pigCounter())。但我无处可去。

onCreate

class MainActivity : AppCompatActivity() {
private var liveData: MutableLiveData<String> = MutableLiveData()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
<SNIP>

...
</SNIP>

liveData.observe(this, androidx.lifecycle.Observer {
        imageView_mothership_LED_state.showOrHideImage(it == "1")
    })

pigCounter()

}

下面来自activity_main.xml

imageView_mothership_LED_state

<ImageView
        android:id="@+id/imageView_mothership_LED_state"
        android:layout_width="124dp"
        android:layout_height="144dp"
        android:scaleType="fitCenter"
        android:soundEffectsEnabled="false"
        app:layout_constraintBottom_toBottomOf="@+id/imageView_blueYesOrNo"
        app:layout_constraintEnd_toEndOf="@+id/imageView_blueYesOrNo"
        app:layout_constraintStart_toStartOf="@+id/imageView_blueYesOrNo"
        app:layout_constraintTop_toTopOf="@+id/imageView_blueYesOrNo"
        app:srcCompat="@drawable/ic_check_black_24dp"
        android:contentDescription="Check mark image to indicate if LED is on/off" />

下面是设置图像可见性的功能

showOrHideImage()

// display or don't display check mark image
private fun View.showOrHideImage(imageShow: Boolean) {
    visibility = if (imageShow) View.VISIBLE else View.GONE
}

这是处理传入的蓝牙数据的功能。

readBlueToothDataFromMothership()

private fun readBlueToothDataFromMothership(bluetoothSocket: BluetoothSocket) {
    Log.i(LOGTAG, Thread.currentThread().name)
    val bluetoothSocketInputStream = bluetoothSocket.inputStream
    val buffer = ByteArray(1024)
    var bytes: Int
    //Loop to listen for received bluetooth messages
    while (true) {
        try {
            bytes = bluetoothSocketInputStream.read(buffer)
            val readMessage = String(buffer, 0, bytes)
            liveData.postValue(readMessage)
        } catch (e: IOException) {
            e.printStackTrace()
            break
        }
    }

这是我正在编写的函数,因为我想每次增加一个计数器。

pigCount

private fun pigCount() {
    var count = 0
    var counterTextView = findViewById<TextView>(R.id.textView_blueCounter)

    if(imageView_mothership_LED_state.showOrHideImage(true)) {
        counterTextView.text = count.toString()
        count++
    }

由于类型不匹配(预期为布尔值,获取单位),因此无法使用。我也尝试将其移到onCreate()中的liveData.observe函数中。但路障相同。

谁能指出我正确的方向。我有一个偷偷摸摸的感觉,我对此还遥遥无期。并会赞赏。 :)

android kotlin android-livedata
1个回答
0
投票

要计算LiveData返回true的次数确实很容易,您可以只使用MediatorLiveData

假设您有适当的LiveData<Boolean>,则可以执行以下操作:

val trueFalse = MutableLiveData<Boolean>()

val counter by lazy {
     MediatorLiveData<Int>().apply {
          value = 0 // Initialize the counter
          // Add the trueFalse as a source of this live data
          addSource(trueFalse) { boolVal ->
              if(boolVal == true) {
                  // If the mediator live data had a value, use it, if null use 0; and add +1 to it because the boolVal was true
                  value = (value ?: 0) + 1
              }
          }
     }
}

/* Somewhere else in the code */
fun setupTextView() {
    counter.observe({lifecycle}) {
        val tv = findViewById<TextView>(R.id.tv_something)
        tv.text = "$it"
    }
}

这将创建一个MediatorLiveData,该源将具有trueFalse实时数据作为源。如果值为true,将继续并在counter实时数据中发布新值。

© www.soinside.com 2019 - 2024. All rights reserved.