### Andorid LiveData 使用
[[_TOC_]]
#### Lifycycle 使用
1、继承FragmentActivity 实现LifecycleOwner接口
2、声明一个LifecycleRegistry对象,用于标记Activity的相应声明周期状态,并再相应生命周期改变的时候通过handleLifecycleEvent分发相应的事件。
3、通过传递一个Activity的LifecycleRegistry 对象,来监听相应的生命周期变化
* 示例
```
public class LifycycleActivtiy extends AppCompatActivity implements LifecycleOwner {
LifecycleRegistry lifecycleRegistry;   
@Override   
protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);  
lifecycleRegistry=new LifecycleRegistry(this::getLifecycle);      
lifecycleRegistry.markState(Lifecycle.State.CREATED);       
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE); 
getLifecycle().addObserver(new GenericLifecycleObserver() { 
@Override           
public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {               
LogUtil.e(event.toString());           
}       
});   
}   
@Override   
protected void onStart() {
super.onStart();        l
ifecycleRegistry.markState(Lifecycle.State.STARTED); 
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);   
}   
@Override   
protected void onResume() {       
super.onResume();       
lifecycleRegistry.markState(LifecycleRegistry.State.RESUMED);       
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);   
}   
@Override   
protected void onStop() {       
super.onStop();       
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);   
}   
@Override   
protected void onDestroy() {  
super.onDestroy();       
lifecycleRegistry.markState(LifecycleRegistry.State.DESTROYED);       
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);   
}   
@Override   
public Lifecycle getLifecycle() {  
return lifecycleRegistry;   
}}
```
#### LiveData
可以观察到数据对应的Activity生命周期,通过Observer 添加LifecycleOwner的监听,当Activity处于活动状态下,通过观察者模式通知数据被修改,同样也可以通过observeForever(Observer)添加始终介绍修改的通知,但是这种方式需要手动调用removeObserver(Observer)。
优势:避免内存泄漏。不需手动管理观察数据生命周期,数据、UI同步
常用场景:网络请求返回时,页面已经被destroy()

使用:
1、 引入相关依赖包
```
implementation 'android.arch.lifecycle:extensions:1.1.1'
```
2、LiveData 是一个抽象类,它的子类实现有
MutableLiveData(观察单个数据) 。
MediatorLiveData :继承于MutableLiveData,用于观察管理多个数据源。
常常结合ViewModel 使用。

3、首先实现一个ViewModel
```
public class TestDataModel extends ViewModel {   
MutableLiveData<String> testData=new MutableLiveData<>();  
public MutableLiveData<String> getTestData(){ 
return testData;   
} }
```
在Activity上观察该数据变化
```
ViewModelProviders.of(this).get(TestDataModel.class).getTestData().observe(this,
new Observer<String>() {   
@Override   
public void onChanged(@Nullable String s) {   
LogUtil.e(s);   
}});
```
获取改变该数据源
```
//在该运行的线程上
ViewModelProviders.of(this).get(TestDataModel.class).getTestData().setValue("hello world");
//postValue 运行在this Activity 的主线程上
ViewModelProviders.of(this).get(TestDataModel.class).getTestData().postValue("hello world");
```
ViewModel 传递参数

通过**ViewModelProviders.of(FragmentActivity activity,Factory factory).get(Class<T> modelClass)** 实现参数传递
首先需要实现 **Factory** 接口
```
public interface Factory {   
/**     * Creates a new instance of the given {@code Class}.     * <p>     *     * @param modelClass a {@code Class} whose instance is
requested     * @param <T>        The type parameter for the ViewModel.     * @return a newly created ViewModel     */   
@NonNull   
<T extends ViewModel> T create(@NonNull Class<T> modelClass);
}

```
通过实现Factory,往Factory中传参,在由Factory传入ViewModel
```

public class TestViewModel extends ViewModel {

private final String mValue;
private MutableLiveData<String> mValueEvent = new MutableLiveData<>();

public MutableLiveData<String> getNameEvent() {
return mNameEvent;
}

public TestViewModel(String value) {
mValue = value;
}

public static class Factory implements ViewModelProvider.Factory {
private String value;

public Factory(String str) {
value = str;
}

@Override
public <T extends ViewModel> T create(Class<T> modelClass) {
return (T) new TestViewModel(value);
}
}

public String getValue() {
return mValue;
}}
```
使用
```
ViewModelProviders.of(this, new TestViewModel.Factory(str)).get(TestViewModel.class)
```
示例代码:
https://github.com/RexKell/mvvmDemo

LiveData使用的更多相关文章

  1. 【安卓进阶】LiveData

    最近参与到后端的工作中,虽然以前在工作中使用过PHP,但是这次使用的是Java,开发思路和方式有所不同.后端开发中,做接口也是需要处理大量的业务逻辑关系,同时一些事务之类的技术因素也要考虑好,在架设项 ...

  2. Android LiveData使用

    LiveData是一个可观察的数据持有者类. 与常规observable不同,LiveData是生命周期感知的,当生命周期处于STARTED或RESUMED状态,则LiveData会将其视为活动状态, ...

  3. Jetpack 架构组件 LiveData ViewModel MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  4. Android官方架构组件介绍之LiveData

    LiveData LiveData是一个用于持有数据并支持数据可被监听(观察).和传统的观察者模式中的被观察者不一样,LiveData是一个生命周期感知组件,因此观察者可以指定某一个LifeCycle ...

  5. Android官方架构组件介绍之LiveData(二)

    LiveData LiveData是一个用于持有数据并支持数据可被监听(观察).和传统的观察者模式中的被观察者不一样,LiveData是一个生命周期感知组件,因此观察者可以指定某一个LifeCycle ...

  6. 【Android】ViewModel+LiveData:更加直接地控制视图的方式

    目录 LiveData 前言 使用ViewModel+LiveData LiveData 前言   ViewModel通过将UI data保存在ViewModel类实例的内部,从而大大地将MVC中的 ...

  7. Jetpack系列:LiveData入门级使用方法

    Android APP开发中,开发者们都想有一个公共的组件,可以实现后台数据的监听,同时实时更新到UI进行显示,从而大大简化开发过程.Google针对这一开发需求,提供了Jetpack LiveDat ...

  8. 【Medium 万赞好文】ViewModel 和 LIveData:模式 + 反模式

    原文作者: Jose Alcérreca 原文地址: ViewModels and LiveData: Patterns + AntiPatterns 译者:秉心说 View 和 ViewModel ...

  9. Android框架式编程之LiveData

    一.LiveData 介绍 LiveData是 Google 推荐的 Android 架构组件之一,是一个基于观察者模式的数据容器,但与一般的被观察者不同的是,它是有生命周期感知功能,解决了Andro ...

随机推荐

  1. 域控权限提升PTH攻击

    0x01 漏洞利用条件 1.被pth攻击的计算机未打补丁(KB2871997)2.拿到一台域成员主机并且拿到管理员组的域用户的NTML 3.对方主机存在相同账号并且是管理员组成员 0x02 本地用户N ...

  2. 简单实用的git命令

    1.下载项目 先进入目录然后使用jit $ git clone +"url" 2.项目配置 $ composer install 3.上传项目 $ git add . () $ g ...

  3. zabbix服务深入

    第1章 Grafana自定义图形 1.安装grafana [root@m01 /data/soft]# wget https://dl.grafana.com/oss/release/grafana- ...

  4. 【MySQL】LIMIT以及LIMIT OFFSET

    LIMIT两种方法: 两种方法: ()LIMIT A; #表示从第一条记录开始取A条记录: ()LIMIT A,B; #参数A为可选参数,表示跳过A条数据(默认为0) #参数B为必选参数,表示取B行数 ...

  5. Shell—详解$( )、$(( ))、``与${ }的区别

    https://www.jianshu.com/p/2237f029c385 https://www.cnblogs.com/chenpython123/p/11052276.html https:/ ...

  6. Cross-Site Scripting:Persistent 跨站点脚本:持久性

  7. netcore 2.2 封装 AutoMapper

    在上篇中我们通过创建一个类并继承autoMapper的Profile类 public class Mappings : Profile { public Mappings() { CreateMap& ...

  8. Python中:dict(或对象)与json之间的互相转化

    在Python语言中,json数据与dict字典以及对象之间的转化,是必不可少的操作. 在Python中自带json库.通过import json导入. 在json模块有2个方法, loads():将 ...

  9. C#中PadLeft,PadRight的用法

    今天在遇到一个需求的时候,需要一个字符串实现自增.是根据数据库中一个自增的int类型的值,实现自增的.但是要加上前缀.比如,数据库中有一个自增的值,为,2.那么这个自增的值后面的值就位3.4.5.6. ...

  10. SSM框架之SpringMVC(6)异常处理及拦截器

    SpringMVC(6)异常处理及拦截器 1.异常处理 1.1.异常处理的思路 ​ 系统中异常包括两类:预期异常和运行时异常 RuntimeException,前者通过捕获异常从而获取异常信息,后者主 ...