欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入理解與運(yùn)行Android Jetpack組件之ViewModel

 更新時(shí)間:2023年08月01日 08:54:22   作者:午后一小憩  
ViewModel是Android Jetpack組件之一,是一種用于管理UI相關(guān)數(shù)據(jù)的架構(gòu)組件,它能夠幫助開發(fā)者實(shí)現(xiàn)優(yōu)雅的數(shù)據(jù)驅(qū)動(dòng)和生命周期管理,本文將深入淺出地介紹ViewModel的使用和原理,帶你一步步掌握這個(gè)強(qiáng)大的組件

什么是ViewModel

ViewModel是Android Jetpack組件之一,它的主要目的是將UI控制器(如Activity和Fragment)與數(shù)據(jù)相關(guān)的業(yè)務(wù)邏輯分開,使得UI控制器能夠?qū)W⒂谡故緮?shù)據(jù)和響應(yīng)用戶交互,而數(shù)據(jù)的獲取和處理則交由ViewModel來(lái)管理。這種分離能夠使代碼更加清晰、易于測(cè)試和維護(hù)。

ViewModel的原理

ViewModel的原理其實(shí)并不復(fù)雜。在設(shè)備配置發(fā)生變化(如屏幕旋轉(zhuǎn))導(dǎo)致Activity或Fragment重建時(shí),ViewModel不會(huì)被銷毀,而是保留在內(nèi)存中。這樣,UI控制器可以在重建后重新獲取之前的ViewModel實(shí)例,并繼續(xù)使用其中的數(shù)據(jù),從而避免數(shù)據(jù)丟失和重復(fù)加載。

ViewModelStore和ViewModelStoreOwner

ViewModel的原理涉及兩個(gè)核心概念:ViewModelStore和ViewModelStoreOwner。

ViewModelStore是一個(gè)存儲(chǔ)ViewModel實(shí)例的容器,它的生命周期與UI控制器的生命周期關(guān)聯(lián)。在UI控制器(Activity或Fragment)被銷毀時(shí),ViewModelStore會(huì)清理其中的ViewModel實(shí)例,避免內(nèi)存泄漏。

ViewModelStoreOwner是擁有ViewModelStore的對(duì)象,通常是Activity或Fragment。ViewModelProvider通過(guò)ViewModelStoreOwner來(lái)獲取ViewModelStore,并通過(guò)ViewModelStore來(lái)管理ViewModel的生命周期。

ViewModelProvider

ViewModelProvider是用于創(chuàng)建和獲取ViewModel實(shí)例的工具類。它負(fù)責(zé)將ViewModel與ViewModelStoreOwner關(guān)聯(lián),并確保ViewModel在合適的時(shí)機(jī)被銷毀。

在Activity中獲取ViewModel實(shí)例:

viewModel = new ViewModelProvider(this).get(MyViewModel.class);

在Fragment中獲取ViewModel實(shí)例:

viewModel = new ViewModelProvider(this).get(MyViewModel.class);

使用ViewModel

添加ViewModel依賴

首先,確保你的項(xiàng)目已經(jīng)使用了AndroidX,并在build.gradle中添加ViewModel依賴:

dependencies {
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
}

創(chuàng)建ViewModel

創(chuàng)建ViewModel非常簡(jiǎn)單,只需繼承ViewModel類并在其中定義數(shù)據(jù)和相關(guān)操作。

public class MyViewModel extends ViewModel {
    private MutableLiveData<String> data = new MutableLiveData<>();
    public LiveData<String> getData() {
        return data;
    }
    public void fetchData() {
        // 模擬異步數(shù)據(jù)獲取
        new Handler().postDelayed(() -> {
            data.setValue("Hello, ViewModel!");
        }, 2000);
    }
}

在UI控制器中使用ViewModel

在Activity或Fragment中獲取ViewModel的實(shí)例,并觀察數(shù)據(jù)變化:

viewModel = new ViewModelProvider(this).get(MyViewModel.class);
viewModel.getData().observe(this, data -> {
    // 更新UI
    textView.setText(data);
});
viewModel.fetchData(); // 觸發(fā)數(shù)據(jù)獲取操作

ViewModel與跨組件通信

ViewModel不僅僅用于在單個(gè)UI控制器內(nèi)部共享數(shù)據(jù),它還可以用于在不同UI控制器之間共享數(shù)據(jù),實(shí)現(xiàn)跨組件通信。例如,一個(gè)Fragment中的數(shù)據(jù)可以通過(guò)ViewModel傳遞給Activity。

在Activity中共享數(shù)據(jù):

sharedViewModel = new ViewModelProvider(this).get(SharedViewModel.class);
sharedViewModel.getData().observe(this, data -> {
    // 更新UI
    textView.setText(data);
});

在Fragment中共享數(shù)據(jù):

sharedViewModel = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);

注意:在跨組件通信時(shí),需要使用同一個(gè)ViewModelProvider獲取相同類型的ViewModel實(shí)例。在Activity中,使用this作為ViewModelProvider的參數(shù),在Fragment中,使用requireActivity()作為參數(shù)。

ViewModel與SavedState

有時(shí),我們可能希望在ViewModel中保存一些與UI控制器生命周期無(wú)關(guān)的數(shù)據(jù),以便在重建時(shí)恢復(fù)狀態(tài)。ViewModel提供了SavedState功能,它可以讓我們?cè)赩iewModel中持久化保存數(shù)據(jù)。

示例代碼:

public class MyViewModel extends ViewModel {
    private SavedStateHandle savedStateHandle;
    public MyViewModel(SavedStateHandle savedStateHandle) {
        this.savedStateHandle = savedStateHandle;
    }
    public LiveData<String> getData() {
        return savedStateHandle.getLiveData("data");
    }
    public void setData(String data) {
        savedStateHandle.set("data", data);
    }
}

使用SavedStateViewModelFactory創(chuàng)建帶有SavedState功能的ViewModel:

public class MyActivity extends AppCompatActivity {
    private MyViewModel viewModel;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ViewModelProvider.Factory factory = new SavedStateViewModelFactory(getApplication(), this);
        viewModel = new ViewModelProvider(this, factory).get(MyViewModel.class);
        viewModel.getData().observe(this, data -> {
            // 更新UI
            textView.setText(data);
        });
        if (savedInstanceState == null) {
            // 第一次創(chuàng)建時(shí),觸發(fā)數(shù)據(jù)獲取操作
            viewModel.fetchData();
        }
    }
}

ViewModel使用過(guò)程中的注意點(diǎn)

  • 不要在ViewModel中持有Context的引用,避免引發(fā)內(nèi)存泄漏。
  • ViewModel應(yīng)該只關(guān)注數(shù)據(jù)和業(yè)務(wù)邏輯,不應(yīng)處理UI相關(guān)的操作。
  • 不要在ViewModel中保存大量數(shù)據(jù),避免占用過(guò)多內(nèi)存。
  • 當(dāng)數(shù)據(jù)量較大或需要跨進(jìn)程共享數(shù)據(jù)時(shí),應(yīng)該考慮使用其他解決方案,如Room數(shù)據(jù)庫(kù)或SharedPreferences。

結(jié)論

通過(guò)本文的介紹,你已經(jīng)了解了Android Jetpack ViewModel的使用與原理。ViewModel的出現(xiàn)極大地簡(jiǎn)化了Android開發(fā)中的數(shù)據(jù)管理和生命周期處理,使得應(yīng)用更加健壯和高效。在實(shí)際開發(fā)中,合理使用ViewModel能夠幫助你構(gòu)建優(yōu)雅、易維護(hù)的Android應(yīng)用。

以上就是深入理解與運(yùn)行Android Jetpack組件之ViewModel的詳細(xì)內(nèi)容,更多關(guān)于Android Jetpack ViewModel的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Android中再按一次退出提醒實(shí)現(xiàn)的兩種方法

    Android中再按一次退出提醒實(shí)現(xiàn)的兩種方法

    今天小編就為大家分享一篇關(guān)于Android中再按一次退出提醒實(shí)現(xiàn)的兩種方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04
  • Android實(shí)現(xiàn)拍照截取和相冊(cè)圖片截取

    Android實(shí)現(xiàn)拍照截取和相冊(cè)圖片截取

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)拍照截取和相冊(cè)獲取圖片截取,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Android選擇圖片或視頻進(jìn)行循環(huán)播放

    Android選擇圖片或視頻進(jìn)行循環(huán)播放

    這篇文章主要為大家詳細(xì)介紹了Android選擇圖片或視頻進(jìn)行循環(huán)播放,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 四種Android數(shù)據(jù)存儲(chǔ)方式

    四種Android數(shù)據(jù)存儲(chǔ)方式

    這篇文章主要為大家詳細(xì)介紹了四種Android數(shù)據(jù)存儲(chǔ)方式,感興趣的小伙伴們可以參考一下
    2016-03-03
  • Android 仿小米鎖屏實(shí)現(xiàn)九宮格解鎖功能(無(wú)需圖片資源)

    Android 仿小米鎖屏實(shí)現(xiàn)九宮格解鎖功能(無(wú)需圖片資源)

    最近公司要求做個(gè)九宮格解鎖,本人用的是小米手機(jī),看著他那個(gè)設(shè)置鎖屏九宮格很好看,就做了該組件,不使用圖片資源,純代碼實(shí)現(xiàn),感興趣的朋友參考下吧
    2016-12-12
  • Android開發(fā)中優(yōu)秀的app 異常處理機(jī)制

    Android開發(fā)中優(yōu)秀的app 異常處理機(jī)制

    這篇文章主要介紹了Android開發(fā)中優(yōu)秀的app 異常處理機(jī)制 的相關(guān)資料,需要的朋友可以參考下
    2015-12-12
  • Gradle的安裝和環(huán)境變量的配置詳解

    Gradle的安裝和環(huán)境變量的配置詳解

    這篇文章主要介紹了Gradle的安裝和環(huán)境變量的配置詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 深踩Android Studio 緩存的坑及解決方法

    深踩Android Studio 緩存的坑及解決方法

    這篇文章主要介紹了深踩Android Studio 緩存的坑及解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • Android獲取RecyclerView滑動(dòng)距離方法詳細(xì)講解

    Android獲取RecyclerView滑動(dòng)距離方法詳細(xì)講解

    RecyclerView是Android一個(gè)更強(qiáng)大的控件,其不僅可以實(shí)現(xiàn)和ListView同樣的效果,還有優(yōu)化了ListView中的各種不足。其可以實(shí)現(xiàn)數(shù)據(jù)縱向滾動(dòng),也可以實(shí)現(xiàn)橫向滾動(dòng)(ListView做不到橫向滾動(dòng))。接下來(lái)講解RecyclerView的用法
    2023-01-01
  • Kotlin中的反射機(jī)制深入講解

    Kotlin中的反射機(jī)制深入講解

    反射,簡(jiǎn)單來(lái)說(shuō),是一種在運(yùn)行時(shí)動(dòng)態(tài)地訪問(wèn)對(duì)象屬性和方法的方式,而不需要事先確定這些屬性是什么。下面這篇文章主要給大家介紹了關(guān)于Kotlin中反射機(jī)制的相關(guān)資料,需要的朋友可以參考下
    2018-11-11

最新評(píng)論