1. LiveData介绍

1.1 作用

LiveData是Jetpack AAC的重要组件,一同也有一个同名抽象类。

LiveData,原意是 活着的数据。 数据还能有生命? 先来看下官方的定义:

LiveData 是一appearance种可查数据库体系概论第五版课后答案询的数据存储器类。与常规的可查googleplay安卓版下载询类不同,LiveDgoogle谷歌查找主页ata 具有生命周期感知才干,线程意指它遵照其他运用组件(如 Activity/Fragment)的生命周期。这种感知才干可保证 LiveData 仅更新处于生动生命周期状况的运用组件查询者。

拆解开来:

  1. LiveData是一个数据库原理据持有者,给源数据包装一层。
  2. 源数据运用LiveData包装后,能够被obsegoogle浏览器rver查询,数据有更新时observer可感知。
  3. observer的感知,只产生在(Activity/Fragment)生动生命周期状况(STARTED、RESUMED),LiveData 只会将更新告知给生动的查询者

1.2 特征

运用 LiveData 具有以下优势:

  • 保证界面符合数据状况

    当生命周期状况改动时,LiveData告知Observer政策,能够在observer公积金借款政策中更新界面。查询者能够在生命周期状况更改时改写界面,而数据库体系的中心是不是在每次数据改动时改写界面。

  • 不会产生内存泄露

    observer会在LifecycleOwner状况变为DESTROYEgoogleplayD后自动整理 remove。

  • 不会因 Activity 中止而apple导致溃散

    假定LifegooglecycleOwner生命周期处于数据库是什么非生动状况(如回来栈中的Activity),则它不会接纳任何 LiveData作业

  • 不需求手动清除查询

    开发者不需求在onPause或onDesapplicationtroy办法中清除对LiveData的查询,因为LiveData能感知生命周期状况改动,所以会自动处理悉数这些操作。

  • 数据一贯坚持最新状况

    数据更新时线程 若L数据库体系概论ifecycleOwner为非生动状况,那么会在变为生动时接纳最新数据。例如,从前线程是什么意思在后宫颈癌前期症状台的 Activity 会在回来前台后,observer当即接纳最新的数据。

  • 恰当的工商银行装备更改

    假定因为装备更改(如设备旋转)而从工商银行头创立了 Activity 或 Fragment,它会当即接纳最新的可用数据。

    同享资源

    您能够运用单例办法扩展 LiveData 政策以封装体系服线程是什么意思务,以便在运用中同享它们。LiveData 政策连接到体系服务一次,然后需求相应资源的任何公积金查询者只需查询 LiveData 政策。如需了解概略,请参阅扩展google翻译 LiveData。

2. LiveData 的运用

2.1 根柢运用

依托:

下面来看根柢用法:apple

  1. 创立applicationLiveData实例appear,指定源数据类型。这一般在 ViewModel 类中完毕。
  2. 创立Observer实例,完毕onChange数据库规划d()办法,用于接纳源数据改动并改写UI。能够操控当 LiveData 政策googleplay存储的数据更改时会产生什么。一般状况下,在 Activi数据库办理体系ty 或 Fragment 中创立 Observer 政策。
  3. LiveData实例运用observe()办法添加查询者,并传入LifecycleOwner线程安全,这样会使 Observer 政策枸杞订阅 LiveData 政策,以使其收到有关更改的告知。一般状况下,在 Activity 或 Fragment 中附加 Observer 政策。
  4. LiveData实例运用setValue() / postValue()更新源数据 (子线程要postValue())

实例:

创立 LiveData 政策

LiveData 是一种可用于任何数据的封装容器,其间google浏览器包括可完毕 Collectiogoogle空间ns 的政策,如 ListLiveData 政策一般存储在 ViewModel 政策中,并可经过 getter 办法进行访问,如以下示例中所示:

public class NameViewModappleel extends ViewModel { // 自定义ViewModel
// Create a LiveData wit公积金h a String
private MutableLiveData<String> currentName; // M宫颈癌疫苗utableLiveData -> LiveData的完毕类
public MutableLiveData<String> getCurrentName() {
if (capplicationurrentName == null) {
currentgoogle空间Name = new MutableLiveData<String>();
}
return currentName;
}
// Rest of the ViewModel...
}

留心:请保证用于更新界面的 LiveDa线程同步tGooglea 政策存储在 ViewModel 政策中,而不是将其存储在 Activity 或 Fragment 中google空间原因如下:

​ ① 避免 Ac数据库体系tivity 和 Fragment 过于庞大。现在,这些界面操控器担任闪现数据库规划数据,但不担任存储数据情app装置下载况。

​ ② 将 Live线程池Data 实例与特定的 Activity 或 Fragment 实例分线程和进程的差异是什么离开,并使 LiveData 政策在装备更改后继续存在

查询 LiveData 政策

在大多数状况下,运用组件的 onCreate() 办法是开始查询 Li宫颈癌疫苗veData 政策的正确着手点,原因如下:

  • 保证体系不会从 Activity 或 Fapp装置下载ragment 的 onResume() 办法进行冗余调appreciate用。
  • 保证 Activity 或 Fragment 变为生动状况后具有能够当即闪现的数据。一线程池的创立办法有几种旦运用组件处于 STARTED 状况,就会从它正在数据库规划查询的 LiveDaapproveta 政策接纳最新值。只要在设置了要查询的 LiveData 政策时,才会产生这种状况。

一般,LiveDappearata 仅在数据产生更改时才发送更新,而且仅发送给生动线程安全查询者。application此行为的枸杞一种例外状况是,查询者从非生动状况更改为生动状况时也会收到更新。此外,假定查询者第2次从非生动状况更改为生动状况,则只要在自前次变为生动状况以google来值产生了更改时,它才会收到更新。

google下示例代码说明了怎样开始查询 LiveData 政策:

public class NameActiappstorevity exten线程池的创立办法有几种ds AppCompatActivity {
prgoogleivate NameViewModel model;
@Override
protected void onCreate(Bundle sa数据库是什么vedInstanceState) {
super.onCreatgooglee(savedInstanceStat数据库体系工程师e);
// Other code to setup the activity...
// 获取ViewModel -> 经过ViewModelProvider进行initViewModel的操apple
model = new ViewMode工商银行lProvigoogle浏览器der(this).get(NameViewModel.class);
// 创立 observer政策更新UI
figoogle空间nal Observer<Stringapplication> nagooglemeObserver = new Observer<String>() {
@Override
public void onapp装置下载Changed(@Nullable final Stri线程ng newName) {
//approve 更新UI
nameTextView.setText(newName);
}
};
// 调用 observe() 办法 真正完毕 -&线程池的七个参数gt; 查询ViewModel的数据
model.getCurrentName().observe(this, nameObserver);
}
}

在传递 nameObserver 参数的状况下调用 [observe()](developer.android.goog数据库体系工程师le.cn/reference/a…, android.arch.lifecycle.Observer)) 后,体系会当即调用 onChanged(),从而供给 mC线程池的七个参数urrentName 中存储的最新值。假定 LiveData 政策尚未在 mCurrentName 中设置值,Google则不会调用 onChanged()

更新 L线程和进程的差异是什么iveData 政策

LiveDa线程撕裂者ta 没有揭穿可用的办法来更新存储的数据。MutableLiveData 类将揭穿 setValue(T)postValue(T) 办法,假定您需求修改存储在 LiveData 政策Google中的值,则有必线程撕裂者要运用这些办法。一般状况下会在 ViewModel 中运用 MutableLiveDat线程池a,然后 ViewModel 只会向查询者揭穿不可变的 LiveData 政策。

设置查询者联络后,您能够更新 LiveData 政策的值(如以下示例中所示),这样当用appearance户点按某个按钮时会触发悉数查询者:

button.set枸杞OnClickListener(new OnClickListener() {
@Override公积金
public void onClick(View v) {
String anotherName = "John Doe";
model.getCurrentName().setValue(anoth数据库规划erName);
}
})数据库体系工程师;

在本示例中调用 setValue(T) 导致查询者运用值 John Doe 调用其 onChanged() 办法。本示例中演示的是按下按钮的办法,但也能够出于林林总总的原因调用 setValue(数据库体系)postValue() 来更新 mName,这些原因包括响应网络恳求或数据库加载完毕。在悉数状况下,调用 setValue()postValue() 都会触发查询者并更新界面。

留心:您有必要调用 setValue(T) 办法以从主线程更新 LiveData 政策。假定在作业器线程中实行代码,您能够改用 postValue(数据库体系工程师T) 办法来更新 LiveData 政策。

将 Liv线程池的创立办法有几种eData 与 Room 一同运用

Room线程的几种状态 持久性库支持回来 LiveData 政策的可查询查询。可查询查询归于数据库访问政策 (DAO) 的一部分。

当数据库更新时,Room 会生成更新 LiveData 政策所需的悉数代码。在需求时,生成的代码会在后台线程上异步运行查询。此办法有助于使界面中闪现的数据与存储在数据库中的数据坚持同步。您能够在 Room 持久性库指南中详细了解 Room 和 DAO。

LiveData 感受Activity 活动生命周期的比如
public cl公积金ass LiveDataTestActivity extends AppCompatActivity{
private Muta线程池的七个参数bleLiveData&approvelt;String> mLiveData;APP
@Override
protected void onCreate(Bundle savedIn数据库规划stanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lifecycle_tegoogle浏览器st);
//liveData根柢运用
mLiveData = new MutableLiveData<>();
// 调用 observe() 办法进行数据查询
mLiveData.observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
Log.i(TAG, "onChanged: "+s);
}
});
Log.i(TAG, "onCrAPPeate: ");
mLiveData.setValue("onCreate");//activity对错生动状况,不会回调onC数据库规划hanged。变为生动时,value被onStart中的value掩盖
}
@Override
protected void onStart() {
super.onStart();
Log.i(TAG, "onStart: ");
mLiveDapplicationata.setValue("onStart");//生动状况,会回调onChanged。而且value会掩盖onCreate、onStop中设置的value
}
@Override
protected void onResume() {
super.onResume();
Log.i(TAG, "onResume: ");
mLiveData.setValue("onResume");//生动状况,回调oappearancenChanged
}
@Override
protected void onPa宫颈癌前期症状use() {
su线程池的创立办法有几种pegoogler.onPause();
Log.i(TAG, "onPause: ");
mLiveData.setValue("onPause");//生动状况,回调onChanged
}
@Override
protected void onStop() {
super.onStop();
Log.i(TAG, "onStop: ");
mLiveData.setValue("onStop");//非生动状况,不会回调onAPPChanged。后边变为生动时,value被onStart中的value掩盖
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy: ");
mLiveData.setValue("onDestroy");//非生Google动状况,且此刻Observer已被移除,不会回调onChanged
}
}

留心到 L线程安全iveData实例mL数据库体系概论iveData的创立是运用MutableLiveData,它是LiapproachveData的完毕类,且指定了工商银行源数宫颈癌前期症状据的类型为String。然后创立了接口Observer的实例,完毕其onChangegoogle服务框架d()办法,用于接纳源数据的改动。observer和ActGoivity一同作为参数调用mLiveData的observe()办法,标明obse线程同步rver开始查询mLiveData。然后Activity的全数据库体系概论第五版课后答案部生命周期办法中都调用了mL线程池的七个参数iveData的setValue()办法。 成果日志打印如下:

//翻开页面
2020-11-22 20:23:29.865 13360-13360/com.hfy.androidlearning I/Lifecycle_Test: onCreate线程安全:
2020-11-22 20:23:29.867 13360-133数据库体系概论第五版课后答案60/com.hfy.androidlearning I/Lifecycle_Test: onStart:
2020-11-22 20:23:29.868 13360-13360/com.hfy.androidlearning I/Lifecycle_Test: onChanged: onStart
2020-枸杞11-2google翻译2 20:23:googleplay安卓版下载29.869 13360-13360/com.hfygoogle.androidlearning I/Li数据库fecycle_Test: onResume:
2020-11-22 20:23数据库体系:29.869 13360-13360/com.hfy.androidlearning I/Lifecycle_Test: o数据库查询句子nChanged: onResume
//按Home键
2020-11-22 20:23:34.349 13360-13360/com.hfy.androidlearning I/Lifecycle_Test: onPause:
2020-11-22 20:23:34.349 13360-13360/com.hfy.androidlearningappstore I/Lifecycle_Test: onChanged: onPause
2020-11-22 20:2线程撕裂者3:34.368 13360-13360/数据库体系概论com.hfy.an线程同步droidlearning I/Lifecycle_Tegoogle翻译st: onStop:
//再点开
2020-11-22 20:23:39.145 13360-13360/com.hfy.androidleagoogleplayrapplicationning I/Lifecycle_Test: onStart:
2020-11-22 20:23:39.146 13360-13360/com线程和进程的差异是什么.hfy.androidlearning I/Lifecycle_Test: onChangedgoogleplay安卓版下载:线程安全 onStart
2020-1google地球1-22 20:23:39.147 13360-133appointment60/com.hfy.androidl数据库体系概论第五版课后答案earning I/Lifecycle_Test: onappreciateResume:
2020-11-22 20:23:39.147 13360-13360/com.hfy.androidlearnin宫颈癌前期症状g I/Lifecycle_Test: onChanged: onResume
//回来键退出
2020-1数据库是什么1-22 20:23:56.753 14432-14432/com.hfy.androidlearning I/Lifecycle_Test: onPause:
2020-11-22 2Go1:23:5宫颈癌6.753 144google空间32-14432/com.h数据库查询句子fy.androidlearning I/Lifecycle_Test: onChanged: onPause
2020-11-22 20:23:58.320 14432-14432/com.hfygoogle空间.Googleandroidlearning I/Lifecycle_Test: onStop:
2020-11-22 20:2application3:58.appear322 14432-14432/com.hfy.angoogleplay安卓版下载droidlearning I/Lifecycle_Test: onDestroy:
  • 首先翻开appstore页面,onCreate()中setValue,因为activity对错生动状况,不会当即回调onChanged。当走到onStart()变为生动时,onChanged被调用,但value被onStart()中setValue的value掩盖,所以打印的是onChanged: onStart。(为啥不是接连打印两次呢?: 是宫颈癌疫苗因为ON_START作业是在onStart() return之后,即onStart()走完之后才变为生动appreciate,此刻observer接纳最新的数据。) 接着走到onReapp装置下载sume(),也setValue了,同样是生动状况,所appstore以立刻回调onChang数据库ed,打印onChanged: onResume
  • 按Home键时,onPause()中setValue,生动状况,立刻回调onChanged办法。onStop()实行时现已变为非生动状况,此刻setValue不会当即回调onChgoogle商铺anged办法。
  • 再点开时,走到on线程Start()变为生动时,onCappreciatehanged被调用,但valAPPue被onStart()中setValue的value掩盖,所以打印的是onChanged: onStart。接线程着走到onRes宫颈癌前期症状ume(),也setValue了,同样是生动状况,所以立刻application回调onChagoogle商铺nged。
  • 回来键退出时,onPause()/onStop()的作用和按Home键相同。onDestroy()中setValue,此刻非生动情数据库规划况,且此刻observer已被移除,不会回调onGoogleChanged线程池面试题

别的,除了运用observ数据库体系概论第五版课后答案e()办法添加查询者,也能够运用observeForever(Observer) 办法来注册未相关 LifecycleOwner的查询者。在这种状况下,查询者会被视为一贯处于生动状况。

2.2 拓线程池面试题宽运用

扩展包括两点:

  1. 自定义LiveData,本身回调办法的覆写:onActive()、onInactive()。
  2. 完毕LiveData为单例办法approach,便于在多个Activity、Fragment数据库体系概论之间同享数据。

官方的比如如下:

public class StockLiveData ext数据库体系概论ends LiveData<BigDecimal> {
private static StockLi数据库体系概论ve线程的几种状态Data sInstance; //单实例
pgoogle浏览器rivate StockManager stockManager;
private SimplePriceLi数据库原理stener listener = new Simgoogle商铺plePriceLiapprovestener() {
@Override
public void onPrappeariceChanged(BigDgoogleplay安卓版下载ecimal price) {
setValue(price);//google地球监听到股价改动 运用setValue(price) 奉告悉数生动查询者
}
};
//获取单例
@MainThread
public static Stock线程池的创立办法有几种LiveData get(String symbol) {
if (sInstance == null) {
sInstance = new StockLiveData(symb数据库ol);
}
returgoogleplay安卓版下载n sInstance;
}
pri数据库vate StockLiveData(St公积金ring symbol) {
stockManager = new StockMappointmentanager(symbol);
}
//生动的查询者(LifecycleOwner)数量从 0 变为 1 时调用
@Override
protected void onActive(线程) {
stockManager.requestPriceUpdates(listener);//开始查询股价更新
}
//生动的公积金数据库体系的中心是询者(LifecycleOwner)数量从 1 变Google为 0 时调用。这不代表没有查询者了,可能是全都不生动了。能够运用hasObservers()检查是否有查询者。
@Override
protected void onInactive数据库体系概论第五版课后答案() {
stock公积金借款Manager.removeUpdates(listener);//移除股价更新的查询
}
}

为了查询股票价格改变,继承LiveData自定义了StockLiveData,且为单例办法,只能经过get(String s线程同步ymbol)办法获取实例。 而且重写了onActive()、onInactive数据库体系的中心是(),并加入了 开始查询股价更新、移除股价更新数据库查询句子查询 的逻辑。线程安全

  • onActive()调google商铺用机会为:生动的查询者(Lifecygoogle地球clgoogleplay安卓版下载eOwner线程池)数量从 0 变为 1 时。
  • onInactive()调用机会为:生动的查询者(Lifec线程撕裂者ycleOwner)数量从 1 变为 0 时。

也就是说,只要当 存在生动的查询者(LapproachifecycleOwner)时 才会连接到 股价更新服务 监听股价改动。运用如下:

    public class MyFrag线程池面试题ment extends Fragment {
@Override
public void onViewCreated(@NonNull View数据库体系的中心是 view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
//获取StockLiveData单实例,添加查询者,更新UI
StockLiveData.get(symbol).observe(getViewLifecycleOwner(), price -> {
// Update the UI.
});
}
}

参考博客: www.jianshu.com/p/5af734748…