Android开发之ViewModel的基础应用

写在之前:

众所周知, onSaveInstanceState() 方法是用来存储简单、轻量级的视图状态,以键值对的形式存贮基础数据类型和可序列化数据。

其解决的问题:当活动即将停止(例如:APP 横竖屏切换或分屏时),保存数据。

问题随之而来,其不适用于潜在的大量数据,如用户列表或位图或网络请求数据,这时ViewModel诞生了。

同时,她可以在 fragments 之间共享数据。

开始:

1、ViewModel的贯穿于 activity 的生命周期,开始至销毁;

2、创建

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.
    }
}

3、创建

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 = ViewModelProviders.of(this).get(MyViewModel.class);
        model.getUsers().observe(this, users -> {
            // update UI
        });
    }
}

4、Share data between fragments

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 onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
        itemSelector.setOnClickListener(item -> {
            model.select(item);
        });
    }
}

public class DetailFragment extends Fragment {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
        model.getSelected().observe(this, { item ->
           // Update the UI.
        });
    }
}

结束语:ViewModel 不能持有 activity 的context。

ViewModel must never reference a view, Lifecycle, or any class that may hold a reference to the activity context.

 

 

你可能感兴趣的:(android)