Android JetPack-ViewModel使用

一,介绍:
ViewModel类 旨在以生命周期有意识的方式存储和管理ui相关的数据,ViewModel类允许数据在配置更改(如屏幕旋转)之后存活。

二,特点:
1.保证了数据持久性:在开发中,当我们销毁Activity时,这个页面的数据,也会随之被释放掉,即使,我们用 onSaveInstanceState(),也只是少量的数据,当重启Activity时,会再次请求一遍所需要的数据。
2.避免了内存泄漏:UI控制器经常需要进行异步调用,这可能需要一些时间才能返回。UI控制器需要管理这些调用,并确保系统在销毁这些调用后对其进行清理,以避免潜在的内存泄漏。这种管理需要大量的维护,并且在为配置更改重新创建对象的情况下,这是对资源的浪费,因为对象可能不得不重新发出它已经发出的调用。
3.数据与UI分离:避免在Activity进行网络请求。
4.多个Fragment可以共享数据
实验图在文章尾部

四,环境:

AndroidStudio:3.2+
gradle4.6+:集成了jetpack基础包,如果低于4.6就要引入包。 
我这里不需要,文档环境
gradle版本:
gradle-wrapper.properties→
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
gradle AS插件版本:
build.gradle→
classpath 'com.android.tools.build:gradle:3.4.0'
    //ViewModeld的扩展包 ,安卓SDK自带基础包里面没有这个扩展就会导致 找不到 ViewModelProviders类。
    这个要用1.1.1的 arch包认准。
    api "android.arch.lifecycle:extensions:1.1.1"
    

五,使用ViewModel 。
DataViewModel.class

public class DataViewModel extends ViewModel {
    private MutableLiveData data;
    public MutableLiveData getData() {
        if (data == null) {
            data = new MutableLiveData<>();
        }
        loadData();
        return data;
    }
    int i = 1;
    //模拟一个网络请求操作
    public void loadData() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                //
                while (i < 100) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    data.postValue(i + "");
                    i++;
                }
            }
        }).start();
    }
    /**
     * 业务逻辑
     */
    public void doAction() {
        //注意:必须调用setValue(T)方法才能从主线程更新LiveData对象。如果代码在工作线程中执行,则可以使用postValue(T)方法来更新LiveData对象
        data.postValue("执行了业务逻辑");
        /**
         * POSTValue的优先级大于setVaslue
         */
    }
}

MainActivity.class

public class MainActivity extends AppCompatActivity {
    private DataViewModel model;
    ActivityMainBinding binding;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
          binding= DataBindingUtil.setContentView(this,R.layout.activity_main);
          //①
        model = ViewModelProviders.of(this).get(DataViewModel.class);
        model.getData().observe(this, new Observer() {
            @Override
            public void onChanged(Object o) {
                //坚挺数据,并更新到UI,
                binding.setData(o+"");
            }
        });
        binding.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //执行一些业务逻辑
                model.doAction();
            }
        });
 
    }
}

六,在上面案例中,使用了如下方法:

        1,意思是在当前的Activity声明内容提供ViewModel,数据在DataViewModel这个类里面取。
        model = ViewModelProviders.of(this).get(DataViewModel.class);	
       

		2,这是一个观察者模式,连着写的。OnChanged负责监听数据改变时,更改UI。
		写法一:”
	    model.getData().observe(this, new Observer() {
            @Override
            public void onChanged(Object o) {
                //监听数据,并更新到UI,
                binding.setData(o+"");
            }
        });
        
	写法二:
 		Observer observer=new Observer() {
		           @Override
		           public void onChanged(Object o) {
		               //UI更新
		           }
		       };
       model.getData().observe(this,observer);
     

PostValue和SetValue区别:
setValue在主线程中使用,PostValue可以在主线程也可以在子线程中使用,如果同时使用那么,postValue会覆盖setValue的值,这个不分先后。
ViewModel不能引用视图、生命周期或任何可能包含对活动上下文引用的类。
ViewModel的生命周期比Activity长。如果要监听生命周期则要扩展AndroidViewModel类。

附加图:
Android JetPack-ViewModel使用_第1张图片

你可能感兴趣的:(Android,JetPack)