ViewModel

編寫說明,文章收錄于《Android Jetpack》,文章將大部分摘錄于
官方教程

ViewModel

ViewModel 類旨在以注重生命周期的方式存儲和管理界面相關(guān)的數(shù)據(jù)。ViewModel 類讓數(shù)據(jù)可在發(fā)生屏幕旋轉(zhuǎn)等配置更改后繼續(xù)留存

界面控制器雷點

  • 系統(tǒng)銷毀或重新創(chuàng)建界面控制器,則存儲在其中的任何瞬態(tài)界面相關(guān)數(shù)據(jù)都會丟失
  • 界面控制器經(jīng)常需要進行可能需要一些時間才能返回的異步調(diào)用。界面控制器需要管理這些調(diào)用,并確保系統(tǒng)在其銷毀后清理這些調(diào)用以避免潛在的內(nèi)存泄漏

實現(xiàn) ViewModel

public class MyViewModel extends ViewModel {
    private MutableLiveData<List<User>> users;
    public LiveData<List<User>> getUsers() {
        if (users == null) {
            users = new MutableLiveData<List<User>>();
            loadUsers();
        }
        return users;
    }

    private void loadUsers() {
        // Do an asynchronous operation to fetch users.
    }
}
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
        });
    }
}

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

ViewModel 的生命周期

viewmodel-lifecycle.png

您通常在系統(tǒng)首次調(diào)用 Activity 對象的 [onCreate()](https://developer.android.google.cn/reference/android/app/Activity#onCreate(android.os.Bundle)) 方法時請求 ViewModel。系統(tǒng)可能會在 activity 的整個生命周期內(nèi)多次調(diào)用 [onCreate()](https://developer.android.google.cn/reference/android/app/Activity#onCreate(android.os.Bundle)),如在旋轉(zhuǎn)設(shè)備屏幕時。ViewModel 存在的時間范圍是從您首次請求 ViewModel 直到 activity 完成并銷毀。

在 Fragment 之間共享數(shù)據(jù)

public class SharedViewModel extends ViewModel {
    private final MutableLiveData<Item> selected = new MutableLiveData<Item>();

    public void select(Item item) {
        selected.setValue(item);
    }

    public LiveData<Item> 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.
        });
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ViewModel[https://developer.android.google.cn/reference/a...
    newTask閱讀 2,272評論 0 0
  • 簡介 當前大前端主流的架構(gòu)為 MVVM,即 Model-View-ViewModel,Model 表示數(shù)據(jù)模型,V...
    Whyn閱讀 698評論 0 0
  • 用jetpack框架編寫了一個簡易的網(wǎng)絡(luò)請求流程,效果如下: 由于接口對接的是我們開發(fā)環(huán)境地址,所以我把地址相關(guān)的...
    谷哥得小弟閱讀 1,940評論 0 2
  • 概覽 在考慮到UI 元素生命周期變化的環(huán)境下,架構(gòu)組件中的 ViewModel 主要用于存儲以及管理UI相關(guān)的數(shù)據(jù)...
    raywalker閱讀 1,529評論 0 2
  • 16宿命:用概率思維提高你的勝算 以前的我是風險厭惡者,不喜歡去冒險,但是人生放棄了冒險,也就放棄了無數(shù)的可能。 ...
    yichen大刀閱讀 8,199評論 0 4

友情鏈接更多精彩內(nèi)容