網站首頁 編程語言 正文
Android Jetpack之LifeCycle
一、ViewModel
ViewModel是介于View(視圖)和Model(數據模型)之間的中間層,能夠使視圖和數據分離,又能提供視圖和數據之間的通信。如圖所示:
1、解決的問題
- 屏幕翻轉后頁面數據的丟失;
- 異步調用導致的內存泄露;
- 類膨脹提高維護難度和測試難度;
2、注意點事項
- ViewModel的生命周期要比Activity的生命周期更長,因此在使用ViewModel時,不要向ViewModel傳入Activity的Context,因為這樣會導致內存泄露。
- 如果必須使用Context,可使用AndroidViewModel中的Application。
3、ViewModel案例
我們知道,Android橫豎屏切換時,當前的Activity會被銷毀重建,然后Activity上面的數據將會全部丟失。(如Listview上面每個item的checkbox,橫豎屏切換時,復選框就丟失所有選中信息)。一般,我們解決辦法是,在配置清單Androidmanifest.xml的activity標簽中加入android:configChanges="orientation|keyboardHidden",或在Activity里面通過復寫onConfigurationChanged方法,實現在不同的屏幕狀態下的處理方式。
那么,使用ViewModel將會是怎樣的?
首先,創建一個連接層類MyViewModel.kt 繼承AndroidViewModel,里面定義了number變量。
class MyViewModel(application: Application) : AndroidViewModel(application) {
var number = 0 //
}
然后,在activity中使用:
class TestActivity : AppCompatActivity() {
private var textView: TextView? = null
private var viewModel: MyViewModel? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
textView = findViewById(R.id.textView)
//實例化viewModel
viewModel =ViewModelProvider(this,
AndroidViewModelFactory(application))[MyViewModel::class.java]
//顯示數據
textView!!.text = String.valueOf(viewModel!!.number)
}
//點擊事件
fun plusNumber(view: View) {
textView!!.text = String.valueOf(++viewModel!!.number)
}
}
實例化對應的viewModel后,通過訪問viewModel里的屬性number,不管怎么切換橫豎屏,對應的屏幕上的數字都不會被清空。
二、LiveData
如上案例中,如果點擊事件只是改變了viewmodel中的number值,text就不會刷新顯示。LiveData就是一個能夠在ViewModel中數據發生變化時通知頁面刷新UI線程的組件庫。LiveData和ViewModel的關系,如下圖所示:
1、viewmodel+livedata使用案例
首先,修改一下MyViewModel.kt
class MyViewModel : ViewModel() {
//定義LiveData集合
private var linkNumber: MutableLiveData<Int>? = null
//得到LiveData集合
fun getLinkNumber(): MutableLiveData<Int>? {
if (linkNumber == null) {
//初始化
linkNumber = MutableLiveData()
linkNumber!!.value = 0
}
return linkNumber
}
//給外部提供修改集合內部屬性的方法
fun addLinkedNumber(n: Int) {
linkNumber!!.value = linkNumber!!.value!! + n
}
}
在activity中使用:
class MainActivity : AppCompatActivity() {
private var viewModel: MyViewModel? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val textView: TextView = findViewById(R.id.textView)
viewModel =ViewModelProvider(this,
AndroidViewModelFactory(application))[MyViewModel::class.java]
//觀察
viewModel!!.getLinkNumber()!!.observe(this, Observer {
textView.text = String.valueOf(it)
})
}
fun reduce(view: View) {
viewModel!!.addLinkedNumber(-1)
}
fun add(view: View) {
viewModel!!.addLinkedNumber(1)
}
}
上面案例中,ViewModel的初始化不變。在點擊事件中調用addLinkedNumber()方法,對ViewModel對應LiveData集合進行修改操作。viewModel!!.getLinkNumber()!!.observe(this, Observer {xx},來接受ViewModel發過來的修改通知,并及時更新至textView上。
2、viewmodel+livedata
優勢總結
- 頁面翻轉數據狀態保留
- 不再需要手動處理生命周期
- 數據始終保持最新狀態
- 不會發生內存泄露
- 異步情況,不會因Activity停止而導致崩潰
原文鏈接:https://blog.csdn.net/csdn_aiyang/article/details/126828596
相關推薦
- 2022-08-08 redis如何實現保存對象_Redis
- 2022-07-03 Golang之函數選項模式
- 2023-03-18 pandas數據聚合與分組運算的實現_python
- 2023-03-26 python命令行參數argparse模塊基本用法詳解_python
- 2023-12-11 Mybatis對于多對一和一對多的處理
- 2022-05-02 三行Python代碼提高數據處理腳本速度_python
- 2023-01-13 Pytorch如何加載自己的數據集(使用DataLoader讀取Dataset)_python
- 2022-07-18 Linux 文件內容瀏覽;cut命令;uniq命令;sort命令;tr命令;
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支