### 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. Matlab非线性规划

    非线性规划 在matlab非线性规划数学模型可以写成一下形式: \[ minf(x)\\ s.t.\begin{cases} Ax \le B \\ Aeq·x = Beq\\ C(x) \le 0\ ...

  2. jquery-获取button的值

    <button id="test" name="test_name" value="test_value"></butto ...

  3. 比较3个开源数据库:PostgreSQL,MariaDB和SQLite

    在现代企业技术世界里,开源软件已牢固地确立了自己作为不可忽视的,最大力量之一的地位.由于开源运动的出现,推动了几十年来的一些最著名的技术发展. 不难理解为什么:尽管基于Linux的开源网络标准可能不像 ...

  4. (八十一)c#Winform自定义控件-时间轴-HZHControls

    官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...

  5. 一起学Spring之三种注入方式及集合类型注入

    本文主要讲解Spring开发中三种不同的注入方式,以及集合数据类型的注入,仅供学习分享使用,如有不足之处,还请指正. 概述 Spring的注入方式一共有三种,如下所示: 通过set属性进行注入,即通过 ...

  6. C# base

    using System; using System.Collections.Generic; using System.Text; namespace 继承 { class Program { st ...

  7. find 常用命令

    系统中总会不断产生一些文件,比如日志文件,不一定会用到也不会自动删除,这时候就需要手动删除,当然也可以转存到其他目录下.不好找的时候可以用find模糊查找,加个job定时任务自动执行定期删除文件1.添 ...

  8. dbms_profiler

    @?/rdbms/admin/profload.sql @?/rdbms/admin/proftab.sql CREATE or replace PUBLIC SYNONYM plsql_profil ...

  9. 浅谈——MySQL存储引擎

    博文大纲: 一.MyISAM存储引擎: 二.InnoDB存储引擎: 三.Memory存储引擎特点: 四.如何选择合适的存储引擎? 前言 数据库存储引擎是数据库底层软件组件,数据库管理系统(DBMS)使 ...

  10. java之instanceof操作符

    a intanceof A:判断a是否是类A的的一个实例,返回值为boolean public class Person extends Object{} public class Student e ...