国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Jetpack】ViewModel 架構(gòu)組件 ( 視圖 View 和 數(shù)據(jù)模型 Model | ViewModel 作用 | ViewModel 生命周期 | 代碼示例 | 使用注意事項(xiàng) )

這篇具有很好參考價(jià)值的文章主要介紹了【Jetpack】ViewModel 架構(gòu)組件 ( 視圖 View 和 數(shù)據(jù)模型 Model | ViewModel 作用 | ViewModel 生命周期 | 代碼示例 | 使用注意事項(xiàng) )。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。





一、Activity 遇到的問題



Activity 遇到的問題 :

  • 瞬態(tài)數(shù)據(jù)丟失 : 操作 Activity 時(shí) , 如果 屏幕 自動(dòng)旋轉(zhuǎn) , 當(dāng)前 Activity 組件會(huì) 執(zhí)行銷毀操作 , 并重新創(chuàng)建新的 Activity 組件 , 該操作會(huì) 導(dǎo)致 Activity 的 瞬態(tài)數(shù)據(jù) 丟失 ;
  • 內(nèi)存泄漏 : 在 系統(tǒng)組件 如 Activity 中 , 啟動(dòng)了一個(gè)線程 , 在線程中執(zhí)行一系列操作 , 如果 Activity 在線程停止前銷毀 , 那么 從 Activity 銷毀 到 線程停止前 的這一段時(shí)間 , 就出現(xiàn)了內(nèi)存泄漏問題 ;
  • 組件代碼量大 : 在 Activity 中寫了大量的代碼 , 導(dǎo)致 可維護(hù)性 降低 , 測試難度 增加 ;




二、視圖 View 和 數(shù)據(jù)模型 Model



在 Activity 中 , 存在兩種元素 , 視圖 View 和 填充視圖數(shù)據(jù)用的 數(shù)據(jù)模型 Model ;

如果將 視圖 和 數(shù)據(jù)模型 都寫在 Activity 中 , 二者 耦合程度很高 ,

此時(shí) , 就會(huì)造成上述 Activity 的三大問題 : ① 丟失瞬態(tài)數(shù)據(jù) , ② 內(nèi)存泄漏 , ③ 組件代碼量大 ;





三、ViewModel 架構(gòu)組件作用



為了解決上述問題 , 提出了 ViewModel 架構(gòu)組件 ,

該組件 是 視圖 View數(shù)據(jù)模型 Model 之間 的 溝通橋梁 ;

借助 ViewModel , 視圖 與 數(shù)據(jù)模型 實(shí)現(xiàn)了 解耦 , 同時(shí) 還能保證 視圖 與 數(shù)據(jù)模型 之間 保持 通信 ;

這樣 Activity 的代碼量減少了 , 只需要維護(hù) 視圖 View 相關(guān)內(nèi)容 , 增加了代碼的可維護(hù)性 , 以及可測試性 ;

viewmodel 生命周期,# Jetpack,Android,Jetpack,ViewModel,架構(gòu),AndroidViewMode

在 ViewModel 架構(gòu)中 , 數(shù)據(jù) 不由 View 直接進(jìn)行管理 , 而是 由 ViewModel 進(jìn)行管理 ;

當(dāng) Activity 屏幕旋轉(zhuǎn) , 銷毀時(shí) , 只會(huì)銷毀 Activity 組件 , 不會(huì)將 ViewModel 以及 數(shù)據(jù)模型 Model 銷毀 ;

Activity 中的組件 獲取數(shù)據(jù)時(shí) , 不直接從 數(shù)據(jù)模型 Model 中獲取 , 而是 從 ViewModel 架構(gòu)組件中獲取 ;


ViewModel 作用 :

  • 保存瞬態(tài)數(shù)據(jù)
  • 作為 View 視圖 與 Model 數(shù)據(jù)模型 的橋梁
  • 作為 不同的 Activity 或 Fragment 之間溝通的橋梁




四、ViewModel 代碼示例




1、ViewModel 視圖模型


ViewModel 視圖模型 繼承 androidx.lifecycle.ViewModel 類 , 在其中定義要維護(hù)的數(shù)據(jù)即可 ;

代碼示例 :

package kim.hsl.viewmodeldemo

import androidx.lifecycle.ViewModel

class MyViewModel : ViewModel() {
    var number: Int = 0
}

2、Activity 組件


在 Activity 中 , 要 綁定 ViewModel 組件 , 通過 ViewModelProvider 獲取 MyViewModel::class.java 類 對(duì)應(yīng)的 ViewModel 實(shí)例對(duì)象 ;

代碼示例 :

package kim.hsl.viewmodeldemo

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.TextView
import androidx.lifecycle.ViewModelProvider

class MainActivity : AppCompatActivity() {

    lateinit var textView: TextView
    lateinit var myViewModel: MyViewModel

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

        // 獲取布局組件
        textView = findViewById(R.id.textView)

        // 獲取 ViewModel
        myViewModel = ViewModelProvider(this,
            ViewModelProvider.AndroidViewModelFactory(application))
            .get(MyViewModel::class.java)

        // 組件中顯示 ViewModel 中的內(nèi)容
        textView.setText("${myViewModel.number}")
    }

    fun onClick(view: View) {
        myViewModel.number++
        textView.setText("${myViewModel.number}")
    }
}

3、UI 布局文件


點(diǎn)擊按鈕 , 令顯示的文本數(shù)字自增 ;

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="0"
        android:textSize="40sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.3" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="數(shù)值自增"
        android:textSize="40sp"
        android:onClick="onClick"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.5" />

</androidx.constraintlayout.widget.ConstraintLayout>

4、運(yùn)行效果


在屏幕旋轉(zhuǎn)后 , Activity 銷毀重建 , 也沒有影響數(shù)據(jù)運(yùn)行 , 自增操作沒有被打斷 ;

viewmodel 生命周期,# Jetpack,Android,Jetpack,ViewModel,架構(gòu),AndroidViewMode





五、ViewModel 生命周期



ViewModel 的 生命周期Activity 或 Fragment 的 生命周期 相互獨(dú)立 , ViewModel 不受 Activity 組件銷毀的影響 ;

如果 由于 屏幕旋轉(zhuǎn) 原因 導(dǎo)致的 Activity 銷毀重建 , 與之綁定的 ViewModel 會(huì)在銷毀時(shí)解綁 , Activity 重建時(shí)重新綁定 ;

ViewModel 會(huì)在 應(yīng)用生命周期 內(nèi)存活 , 并且可以在 Activity 或 Fragment 之間共享數(shù)據(jù) ;

viewmodel 生命周期,# Jetpack,Android,Jetpack,ViewModel,架構(gòu),AndroidViewMode


ViewModel 的 生命周期 : 一個(gè) ViewModel 實(shí)例對(duì)象 可以與 多個(gè) Activity 或 Fragment 綁定 ;

  • 創(chuàng)建 : 在 Activity 的 首次啟動(dòng)時(shí) 創(chuàng)建 ViewModel 實(shí)例對(duì)象 , 如果 Activity 多次啟動(dòng) , ViewModel 只會(huì)創(chuàng)建一次 ;
  • 綁定 : Activity 與 ViewModel 關(guān)聯(lián)時(shí) , 開始綁定 ViewModel , Activity 組件中 綁定 ViewModel 代碼如下 ;
        // 獲取 ViewModel
        myViewModel = ViewModelProvider(this,
            ViewModelProvider.AndroidViewModelFactory(application))
            .get(MyViewModel::class.java)
  • 解綁 : 當(dāng) Activity 或者 Fragment 被銷毀時(shí) , 與之綁定的 ViewModel 會(huì)與 UI 組件解綁 ;
  • 銷毀 : ViewModel 關(guān)聯(lián)的所有的 Activity 或 Fragment 全部銷毀 , 則 ViewModel 實(shí)例對(duì)象 也會(huì)被銷毀 ;




六、ViewModel 使用注意事項(xiàng)



ViewModel 使用注意事項(xiàng) :

使用 ViewModel 時(shí) , 不要將 Context 上下文對(duì)象傳入 ViewModel 中 , 否則會(huì)導(dǎo)致內(nèi)存泄漏 ;

如果要使用 Context 上下文對(duì)象 , 則 ViewModel 需要繼承 AndroidViewModel 類 , 在 其構(gòu)造函數(shù) 中獲取 Application 對(duì)象 ;


代碼示例 :

package kim.hsl.viewmodeldemo

import android.app.Application
import androidx.lifecycle.AndroidViewModel

class MyViewModel2 : AndroidViewModel {
    constructor(application: Application) : super(application) {
        // 此處可獲取 Application 上下文對(duì)象
    }
}

博客代碼 :文章來源地址http://www.zghlxwxcb.cn/news/detail-823523.html

  • GitHub : https://github.com/han1202012/ViewModelDemo
  • CSDN : https://download.csdn.net/download/han1202012/87541442

到了這里,關(guān)于【Jetpack】ViewModel 架構(gòu)組件 ( 視圖 View 和 數(shù)據(jù)模型 Model | ViewModel 作用 | ViewModel 生命周期 | 代碼示例 | 使用注意事項(xiàng) )的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 05-1_Qt 5.9 C++開發(fā)指南_Model/View結(jié)構(gòu)基礎(chǔ)(基本原理;數(shù)據(jù)模型;試圖組件;代理)

    05-1_Qt 5.9 C++開發(fā)指南_Model/View結(jié)構(gòu)基礎(chǔ)(基本原理;數(shù)據(jù)模型;試圖組件;代理)

    Model/View(模型/視圖) 結(jié)構(gòu)是 Qt 中用界面組件顯示與編輯數(shù)據(jù)的一種結(jié)構(gòu),視圖 (View)是顯示和編輯數(shù)據(jù)的界面組件,模型 (Model) 是視圖與原始數(shù)據(jù)之間的接口。 Model/View 結(jié)構(gòu)的典型應(yīng)用是在數(shù)據(jù)庫應(yīng)用程序中,例如數(shù)據(jù)庫中的一個(gè)數(shù)據(jù)表可以在一個(gè) OTableView 組件中顯示和編輯。

    2024年02月17日
    瀏覽(42)
  • 【Jetpack】DataBinding 架構(gòu)組件 ③ ( 使用 include 導(dǎo)入二級(jí)界面布局 | 二級(jí)頁面綁定數(shù)據(jù)模型 )

    【Jetpack】DataBinding 架構(gòu)組件 ③ ( 使用 include 導(dǎo)入二級(jí)界面布局 | 二級(jí)頁面綁定數(shù)據(jù)模型 )

    如果在 DataBinding 布局 中 , 通過 include 引入了其它布局 , 數(shù)據(jù)模型對(duì)象 需要 綁定到 通過 include 引入的二級(jí)頁面 布局文件中 ; 在上一篇博客 【Jetpack】DataBinding 架構(gòu)組件 ② ( 字符串拼接函數(shù) | 綁定點(diǎn)擊事件函數(shù) | DataBinding 布局中使用 import 標(biāo)簽導(dǎo)入 Java、Kotlin 類 ) 的示例中

    2023年04月08日
    瀏覽(29)
  • Jetpack業(yè)務(wù)架構(gòu)—四件套(Lifecycle、ViewModel、LiveData、DataBinding)

    Jetpack業(yè)務(wù)架構(gòu)—四件套(Lifecycle、ViewModel、LiveData、DataBinding)

    Jetpack 是一個(gè)由多個(gè)庫組成的套件,可幫助開發(fā)者遵循最佳做法、減少樣板代碼并編寫可在各種 Android 版本和設(shè)備中一致運(yùn)行的代碼,讓開發(fā)者可將精力集中于真正重要的編碼工作。 Android Jetpack組件的優(yōu)勢(shì): Jetpack推出的主要目的是為了能夠讓開發(fā)者更加快速、方便以及高質(zhì)

    2024年02月09日
    瀏覽(28)
  • 【Jetpack】DataBinding 架構(gòu)組件 ⑥ ( RecyclerView 數(shù)據(jù)綁定 )

    【Jetpack】DataBinding 架構(gòu)組件 ⑥ ( RecyclerView 數(shù)據(jù)綁定 )

    在 RecyclerView 中 , 如果要使用 DataBinding 架構(gòu)組件進(jìn)行數(shù)據(jù)綁定 , 首先要 啟用 DataBinding , 并 導(dǎo)入 RecyclerView 依賴 , 在 Module 模塊下的 build.gradle 構(gòu)建腳本 中 , 配置如下內(nèi)容 : 要綁定的數(shù)據(jù)是 RecyclerView 條目的數(shù)據(jù) , 因此需要 將條目布局設(shè)置為 DataBinding 布局 ; 創(chuàng)建 item.xml 布局后

    2023年04月25日
    瀏覽(18)
  • 沉思篇-剖析Jetpack的ViewModel

    沉思篇-剖析Jetpack的ViewModel

    ViewModel做為架構(gòu)組件的三元老之一,是實(shí)現(xiàn)MVVM的有力武器。 ViewModel的基本功能就是管理UI的數(shù)據(jù)。其實(shí),從職責(zé)上來說,這又是對(duì)Activity和Fragment的一次功能拆分。以前存儲(chǔ)在它們內(nèi)部的數(shù)據(jù),需要它們自己處理創(chuàng)建,更新,存儲(chǔ),恢復(fù)的所有過程,同時(shí)它們還要處理UI的數(shù)據(jù)

    2024年02月08日
    瀏覽(29)
  • Qt 中model/View 架構(gòu) 詳解,以及案例實(shí)現(xiàn)相薄功能

    Qt 中model/View 架構(gòu) 詳解,以及案例實(shí)現(xiàn)相薄功能

    ? 我們的系統(tǒng)需要顯示大量數(shù)據(jù),比如從數(shù)據(jù)庫中讀取數(shù)據(jù),以自己的方式顯示在自己的應(yīng)用程序的界面中。早期的 Qt 要實(shí)現(xiàn)這個(gè)功能,需要定義一個(gè)組件,在這個(gè)組件中保存一個(gè)數(shù)據(jù)對(duì)象,比如一個(gè)列表。我們對(duì)這個(gè)列表進(jìn)行查找、插入等的操作,或者把修改的地方寫回

    2024年02月06日
    瀏覽(17)
  • Android JetPack 深入分析ViewModel源碼

    Android JetPack 深入分析ViewModel源碼

    本文主要分析 ViewModel 相關(guān)源碼,相關(guān)使用不再贅述,可參考Android ViewModel使用; ViewModel 概覽 Google官方給的 ViewModel 定義如下: 定義主要提到兩個(gè)關(guān)鍵點(diǎn): 生命周期 上圖是Google官網(wǎng)提供的 ViewModel生命周期圖示 ,可以看到 ViewModel 的生命周期是從 onCreate 創(chuàng)建到 完成并銷毀

    2024年02月11日
    瀏覽(25)
  • 【微信小程序】-- 常用視圖容器類組件介紹 -- view、scroll-view和swiper(六)

    【微信小程序】-- 常用視圖容器類組件介紹 -- view、scroll-view和swiper(六)

    ?? 所屬專欄:【微信小程序開發(fā)教程】 ?? 作??者:我是夜闌的狗?? ?? 個(gè)人簡介:一個(gè)正在努力學(xué)技術(shù)的CV工程師,專注基礎(chǔ)和實(shí)戰(zhàn)分享 ,歡迎咨詢! ?? 歡迎大家:這里是CSDN,我總結(jié)知識(shí)的地方,喜歡的話請(qǐng)三連,有問題請(qǐng)私信 ?? ?? ?? ??大家好,又見面了,

    2024年01月18日
    瀏覽(99)
  • 王學(xué)崗碼牛jetpack系列之ViewModel

    王學(xué)崗碼牛jetpack系列之ViewModel

    ViewModel的目的:存儲(chǔ)數(shù)據(jù),以注重生命周期的方式管理界面的相關(guān)數(shù)據(jù) viewModel的特性:1,數(shù)據(jù)持久化,不依賴于Activity的生命周期,有自己獨(dú)立的生命周期 2,異步回調(diào)不會(huì)造成內(nèi)存泄漏 3,隔離Model層與View層 4,F(xiàn)ragments間共享數(shù)據(jù) 我們看一段代碼 看下打印結(jié)果 Activity不一樣了,

    2024年02月02日
    瀏覽(22)
  • QT Model/View 設(shè)計(jì)模式中 selection 模型

    Qt的selection模型用于管理TableView中的選擇操作。它允許用戶選擇和操作特定的數(shù)據(jù)。 當(dāng)使用Qt的TableView時(shí),可以使用selection模型來實(shí)現(xiàn)以下用途: 數(shù)據(jù)操作 :通過選擇模型,可以方便地對(duì)所選的單元格或行執(zhí)行數(shù)據(jù)操作,例如復(fù)制、剪切、粘貼、刪除等。 數(shù)據(jù)篩選 :可以使

    2024年01月20日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包