Android - LiveData (MutableLiveData)

1. Einleitung

LiveData ist eine von Jetpack bereitgestellte reaktive Programmierkomponente, die beliebige Datentypen enthalten und Beobachter benachrichtigen kann, wenn sich die Daten ändern. LiveData eignet sich besonders für die Verwendung in Kombination mit ViewModel. Obwohl es auch an anderen Stellen allein verwendet werden kann, wird es in den meisten Fällen in ViewModel verwendet.

Zweitens, verwenden

class PublishViewModel : ViewModel() {

    var content = MutableLiveData<Int>()

    fun contentTop() {
        val contents = content.value ?:0
        content.value = contents+1
    }

    fun contentBt() {
        content.value = 0
    }
}

Ändern Sie die Zählervariable in ein MutableLiveData-Objekt und geben Sie ihren generischen Typ als Int an, um anzugeben, dass sie ganzzahlige Daten enthält.

MutableLiveData ist eine Variable LiveData. Ihre Verwendung ist sehr einfach. Es gibt drei Hauptmethoden zum Lesen und Schreiben von Daten, nämlich getValue(), setValue() und postValue(). Die Methode getValue() wird verwendet, um die in LiveData enthaltenen Daten abzurufen;

Die Methode setValue() wird zum Festlegen von Daten für LiveData verwendet, kann jedoch nur im Hauptthread aufgerufen werden;

Die postValue()-Methode wird verwendet, um Daten in einem Nicht-Hauptthread auf LiveData zu setzen.

Der obige Code ist eigentlich der grammatikalische Zucker zum Aufrufen der Methoden getValue() und setValue().

Es ist ersichtlich, dass die Daten für den Zähler in der Init-Struktur festgelegt sind, sodass bei der Initialisierung der zuvor gespeicherte Zählwert wiederhergestellt werden kann. Als nächstes haben wir zwei Methoden hinzugefügt, Top() und Bt(), die verwendet werden, um 1 zur Zählung hinzuzufügen bzw. die Zählung auf Null zu setzen.

Die Logik in der Top()-Methode besteht darin, zuerst die im Zähler enthaltenen Daten abzurufen, dann 1 dazuzuzählen und sie dann auf den Zähler zurückzusetzen.

Beachten Sie, dass die durch Aufrufen der getValue()-Methode von LiveData erhaltenen Daten leer sein können, daher wird hier ein ?:-Operator verwendet. Wenn die erhaltenen Daten leer sind, wird 0 als Standardanzahl verwendet.

Startseite

class PublishActivity : BaseActivity() {//换成AppCompate()

    lateinit var viewModel: PublishViewModel

    lateinit var sb_content_value: TextView

    @SuppressLint("ResourceType", "MissingInflatedId")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.publish_activity_publish)

        initViewModel()

        initView()

        observe()
    }

    @SuppressLint("SetTextI18n")
    private fun observe() {
        viewModel.content.observe(this, {
            sb_content_value.text = it.toString()
        })
    }

    private fun initView() {
        //Snackbar
        findViewById<Button>(R.id.fab).setOnClickListener { view ->
            viewModel.contentTop()
            Snackbar.make(view, "++", Snackbar.LENGTH_LONG)
                .setAction("撤消") {
                    viewModel.contentBt()
                }.show()
        }
        //
        sb_content_value = findViewById(R.id.sb_content_value)
    }

    private fun initViewModel() {
        viewModel = ViewModelProvider(this).get(PublishViewModel::class.java)
    }
}

Hier wird die Observ()-Methode von viewModel.counter aufgerufen, um die Änderungen der Daten zu beobachten. Nach der Transformation von MainViewModel ist die Zählervariable nun zu einem LiveData-Objekt geworden, und jedes LiveData-Objekt kann seine observ()-Methode aufrufen, um die Datenänderung zu beobachten. Die Methode „observ()“ empfängt zwei Parameter: Der erste Parameter ist ein LifecycleOwner-Objekt. Kommt Ihnen das bekannt vor? Richtig, die Aktivität selbst ist ein LifecycleOwner-Objekt. Übergeben Sie dies also einfach direkt. Der zweite Parameter ist eine Observer-Schnittstelle. Wenn sich die im Zähler enthaltenen Daten ändern, werden sie hierher zurückgerufen. Daher stellen wir hier die neueste Zählung ein. Aktualisieren Sie einfach die Schnittstelle.

Drittens, pass auf

Wenn Sie Daten für LiveData im untergeordneten Thread festlegen müssen, müssen Sie die Methode postValue() anstelle der Methode setValue() aufrufen, andernfalls kommt es zu einem Absturz.

Darüber hinaus möchte ich noch ein paar Worte zur „observ()“-Methode von LiveData sagen, da ich beim Erlernen dieses Teils des Inhalts auch Zweifel hatte. Die observ()-Methode ist eine Java-Methode. Wenn Sie sich die Observer-Schnittstelle ansehen, werden Sie feststellen, dass es sich um eine einzelne abstrakte Methodenschnittstelle mit nur einer zu implementierenden onChanged()-Methode handelt. Da es sich um eine Schnittstelle mit einer einzigen abstrakten Methode handelt, warum wurde beim Aufruf der Observ()-Methode nicht die Java-Funktions-API verwendet?

Dies ist ein ganz besonderer Fall, da ein weiterer Parameter, den LifecycleOwner von der Observer()-Methode empfängt, ebenfalls eine einzelne abstrakte Methodenschnittstelle ist. Wenn eine Java-Methode gleichzeitig zwei Schnittstellenparameter einer einzelnen abstrakten Methode empfängt, verwendet sie entweder gleichzeitig die funktionale API oder nicht gleichzeitig die funktionale API. Da unser erster Parameter dieser ist, kann der zweite Parameter nicht in eine funktionale API geschrieben werden.

Auf der Google I/O-Konferenz im Jahr 2019 kündigte das Android-Team jedoch offiziell Kotlin First an und versprach, in Zukunft weitere APIs speziell für die Kotlin-Sprache in Jetpack bereitzustellen. Unter anderem ist lifecycle-livedata-ktx eine Bibliothek, die speziell für die Kotlin-Sprache entwickelt wurde. Diese Bibliothek hat in Version 2.2.0 eine Syntaxerweiterung zur Observ()-Methode hinzugefügt. Wir müssen lediglich die folgenden Abhängigkeiten zur Datei app/build.gradle hinzufügen:

dependencies {
 ...
 implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0"
}

Dann können Sie die Methode „observ()“ mit der folgenden Syntaxstruktur verwenden:

viewModel.counter.observe(this) { count ->
 infoText.text = count.toString()
}

Guess you like

Origin blog.csdn.net/m0_59482482/article/details/130205216