### 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. Navicat Keygen - 注册机是怎么工作的?

    Navicat Keygen - 注册机是怎么工作的? 1. 关键词解释. Navicat激活公钥 这是一个2048位的RSA公钥,Navicat使用这个公钥来完成相关激活信息的加密和解密. 这个公钥 ...

  2. VMware Workstation 15 Pro中安装ubuntu1804

    这篇笔记是一篇安装教程,没有什么实际的意义,仅为了记录一下……距离上次弄这东西不知道多长时间了,以至于这次再次使用时很是生疏,于是就想着把过程记录下来方便之后查看. 这里不涉及VMware Works ...

  3. [Linux] linux路由表

    路由表用于决定数据包从哪个网口发出,其主要判断依据是目标IP地址Linux路由表其实有2个主要概念:按顺序走路由策略,在路由策略对应的路由表中匹配规则路由策略(rule)路由表(table) 查看所有 ...

  4. PKUWC 2020 游记

    由于 CSP 的暴力分太高,我来了这里. 我将告诉大家,我在暴力分不高时是个怎样的 sb 选手. Day -17 又停课啦. 旁边坐着 pb,每天刷题特别猛,然后就凸显了我有多颓. 怎么想打开个猫国都 ...

  5. ROS--自定义消息类型

    一.msg 用于发布-订阅的通信方式中. 1.在包的src 中创建msg文件夹. 2.在msg文件夹中,创建.msg文件 3.编辑.msg文件 4.编辑package.xml , 添加依赖 <b ...

  6. 【网络安全】SSH协议科普文

    写代码的木公 本文转载自:https://baijiahao.baidu.com/s?id=1612411213158569988&wfr=spider&for=pc 熟悉Linux的 ...

  7. python的学习大纲

    python基础部分 函数 初识函数 函数进阶 装饰器函数 迭代器和生成器 内置函数和匿名函数 递归函数 常用模块 常用模块 模块和包 面向对象 初识面向对象 面向对象进阶 网络编程 网络编程 并发编 ...

  8. 【坑】The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone.

    在使用spring JDBC 连接数据库时出现的错误: Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: ...

  9. Nginx 入门学习

    什么是 Nginx Nginx 是一款轻量级高性能的web 和 反向代理服务器,类似于Apache,也是一个 IMAP/POP3/SMTP (电子邮件)代理服务器.由俄罗斯程序设计师 Igor Sys ...

  10. forEach和map的区别,简单写了IE低版本的原形封装

    今天有点'不务正业',旧的没有写完又开新的,没办法 -0- 今天遇到这个特感兴趣嘛入正题了 forEach 和 map 的区别 参考:http://blog.csdn.net/boysky0015/a ...