日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android.app.activityview,ViewModel 概览

發布時間:2025/3/12 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android.app.activityview,ViewModel 概览 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ViewModel 概覽

ViewModel 類旨在以注重生命周期的方式存儲和管理界面相關的數據。ViewModel 類讓數據可在發生屏幕旋轉等配置更改后繼續留存。

注意:如需將 ViewModel導入 Android 項目,請參閱 Lifecycle 版本說明中關于聲明依賴項的說明。

Android 框架可以管理界面控制器(如 Activity 和 Fragment)的生命周期。Android 框架可能會決定銷毀或重新創建界面控制器,以響應完全不受您控制的某些用戶操作或設備事件。

如果系統銷毀或重新創建界面控制器,則存儲在其中的任何瞬態界面相關數據都會丟失。例如,應用可能會在它的某個 Activity 中包含用戶列表。為配置更改重新創建 Activity 后,新 Activity 必須重新提取用戶列表。對于簡單的數據,Activity 可以使用

另一個問題是,界面控制器經常需要進行可能需要一些時間才能返回的異步調用。界面控制器需要管理這些調用,并確保系統在其銷毀后清理這些調用以避免潛在的內存泄漏。此項管理需要大量的維護工作,并且在為配置更改重新創建對象的情況下,會造成資源的浪費,因為對象可能需要重新發出已經發出過的調用。

諸如 Activity 和 Fragment 之類的界面控制器主要用于顯示界面數據、對用戶操作做出響應或處理操作系統通信(如權限請求)。如果要求界面控制器也負責從數據庫或網絡加載數據,那么會使類越發膨脹。為界面控制器分配過多的責任可能會導致單個類嘗試自己處理應用的所有工作,而不是將工作委托給其他類。以這種方式為界面控制器分配過多的責任也會大大增加測試的難度。

從界面控制器邏輯中分離出視圖數據所有權的操作更容易且更高效。

實現 ViewModel

架構組件為界面控制器提供了 ViewModel 輔助程序類,該類負責為界面準備數據。在配置更改期間會自動保留 ViewModel 對象,以便它們存儲的數據立即可供下一個 Activity 或 Fragment 實例使用。例如,如果您需要在應用中顯示用戶列表,請確保將獲取和保留該用戶列表的責任分配給 ViewModel,而不是 Activity 或 Fragment,如以下示例代碼所示:

Kotlin

class MyViewModel : ViewModel() {

private val users: MutableLiveData> by lazy {

MutableLiveData>().also {

loadUsers()

}

}

fun getUsers(): LiveData> {

return users

}

private fun loadUsers() {

// Do an asynchronous operation to fetch users.

}

}Java

public class MyViewModel extends ViewModel {

private MutableLiveData> users;

public LiveData> getUsers() {

if (users == null) {

users = new MutableLiveData>();

loadUsers();

}

return users;

}

private void loadUsers() {

// Do an asynchronous operation to fetch users.

}

}

然后,您可以從 Activity 訪問該列表,如下所示:

Kotlin

class MyActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

// Create a ViewModel the first time the system calls an activity's onCreate() method.

// Re-created activities receive the same MyViewModel instance created by the first activity.

// Use the 'by viewModels()' Kotlin property delegate

// from the activity-ktx artifact

val model: MyViewModel by viewModels()

model.getUsers().observe(this, Observer>{ users ->

// update UI

})

}

}Java

public class MyActivity extends AppCompatActivity {

public void onCreate(Bundle savedInstanceState) {

// Create a ViewModel the first time the system calls an activity's onCreate() method.

// Re-created activities receive the same MyViewModel instance created by the first activity.

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

model.getUsers().observe(this, users -> {

// update UI

});

}

}

如果重新創建了該 Activity,它接收的 MyViewModel 實例與第一個 Activity 創建的實例相同。當所有者 Activity 完成時,框架會調用 ViewModel 對象的 onCleared() 方法,以便它可以清理資源。

注意:ViewModel 絕不能引用視圖、Lifecycle 或可能存儲對 Activity 上下文的引用的任何類。

ViewModel 的生命周期

ViewModel 對象存在的時間范圍是獲取 ViewModel 時傳遞給 ViewModelProvider 的 Lifecycle。ViewModel 將一直留在內存中,直到限定其存在時間范圍的 Lifecycle 永久消失:對于 Activity,是在 Activity 完成時;而對于 Fragment,是在 Fragment 分離時。

圖 1 說明了 Activity 經歷屏幕旋轉而后結束時所處的各種生命周期狀態。該圖還在關聯的 Activity 生命周期的旁邊顯示了 ViewModel 的生命周期。此圖表說明了 Activity 的各種狀態。這些基本狀態同樣適用于 Fragment 的生命周期。

您通常在系統首次調用 Activity 對象的 ViewModel。系統可能會在 Activity 的整個生命周期內多次調用 ViewModel 存在的時間范圍是從您首次請求 ViewModel 直到 Activity 完成并銷毀。

在 Fragment 之間共享數據

Activity 中的兩個或更多 Fragment 需要相互通信是一種很常見的現象。想象一下拆分視圖 (master-detail) Fragment 的常見情況,假設您有一個 Fragment,在該 Fragment 中,用戶從列表中選擇一項,還有另一個 Fragment,用于顯示選定項的內容。這種情況不太容易處理,因為這兩個 Fragment 都需要定義某種接口描述,并且所有者 Activity 必須將兩者綁定在一起。此外,這兩個 Fragment 都必須處理另一個 Fragment 尚未創建或不可見的情況。

可以使用 ViewModel 對象解決這一常見的難點。這兩個 Fragment 可以使用其 Activity 范圍共享 ViewModel 來處理此類通信,如以下示例代碼所示:

Kotlin

class SharedViewModel : ViewModel() {

val selected = MutableLiveData()

fun select(item: Item) {

selected.value = item

}

}

class MasterFragment : Fragment() {

private lateinit var itemSelector: Selector

// Use the 'by activityViewModels()' Kotlin property delegate

// from the fragment-ktx artifact

private val model: SharedViewModel by activityViewModels()

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

super.onViewCreated(view, savedInstanceState)

itemSelector.setOnClickListener { item ->

// Update the UI

}

}

}

class DetailFragment : Fragment() {

// Use the 'by activityViewModels()' Kotlin property delegate

// from the fragment-ktx artifact

private val model: SharedViewModel by activityViewModels()

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

super.onViewCreated(view, savedInstanceState)

model.selected.observe(viewLifecycleOwner, Observer { item ->

// Update the UI

})

}

}Java

public class SharedViewModel extends ViewModel {

private final MutableLiveData selected = new MutableLiveData();

public void select(Item item) {

selected.setValue(item);

}

public LiveData getSelected() {

return selected;

}

}

public class MasterFragment extends Fragment {

private SharedViewModel model;

public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {

super.onViewCreated(view, savedInstanceState);

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

itemSelector.setOnClickListener(item -> {

model.select(item);

});

}

}

public class DetailFragment extends Fragment {

public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {

super.onViewCreated(view, savedInstanceState);

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

model.getSelected().observe(getViewLifecycleOwner(), item -> {

// Update the UI.

});

}

}

請注意,這兩個 Fragment 都會檢索包含它們的 Activity。這樣,當這兩個 Fragment 各自獲取 ViewModelProvider 時,它們會收到相同的 SharedViewModel 實例(其范圍限定為該 Activity)。

此方法具有以下優勢:

Activity 不需要執行任何操作,也不需要對此通信有任何了解。

除了 SharedViewModel 約定之外,Fragment 不需要相互了解。如果其中一個 Fragment 消失,另一個 Fragment 將繼續照常工作。

每個 Fragment 都有自己的生命周期,而不受另一個 Fragment 的生命周期的影響。如果一個 Fragment 替換另一個 Fragment,界面將繼續工作而沒有任何問題。

將加載器替換為 ViewModel

ViewModel 與一些其他類一起使用來替換加載器。使用 ViewModel 可將界面控制器與數據加載操作分離,這意味著類之間的強引用更少。

在使用加載器的一種常見方法中,應用可能會使用

圖 2. 使用加載器加載數據

ViewModel 與 Room 和 LiveData 一起使用可替換加載器。ViewModel 確保數據在設備配置更改后仍然存在。Room 在數據庫發生更改時通知 LiveData,LiveData 進而使用修訂后的數據更新界面。

圖 3. 使用 ViewModel 加載數據

將協程與 ViewModel 一起使用

ViewModel 支持 Kotlin 協程。如需了解詳情,請參閱將 Kotlin 協程與 Android 架構組件一起使用。

更多信息

隨著數據變得越來越復雜,您可能會選擇使用單獨的類加載數據。ViewModel 的用途是封裝界面控制器的數據,以使數據在配置更改后仍然存在。如需了解如何在配置更改后加載、保留和管理數據,請參閱保存界面狀態。

Android 應用架構指南建議構建存儲區類來處理這些功能。

其他資源

如需詳細了解 ViewModel 類,請參閱以下資源。

示例

Sunflower,這是一款園藝應用,展示了使用 Android Jetpack 進行 Android 開發的最佳做法。

Codelab

博客

視頻

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的android.app.activityview,ViewModel 概览的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。