LiveData是什么
LiveData是数据持有类,是可感知组件生命周期的,当持有的数据发生变化时会通知观察(观察这可以把最新的数据更新到UI上)。
LiveData的功能
可感知组件的生命周期,例如可感知Activity,Fragment,Service的生命周期;
当持有的数据发生变化时可以通知观察者数据有更新,只有组件处于激活状态(STARTED RESUMED)才会通知观察者有数据更新;
当注册观察者时传入的LifecycleOwner变成DESTROYED状态时,观察者会被删除,避免产品内存泄露。
如何使用LiveData
1.引入相关依赖到项目中
dependencies {
def lifecycle_version = "1.1.1"
// ViewModel and LiveData
implementation "android.arch.lifecycle:extensions:$lifecycle_version"
// alternatively - just ViewModel
implementation "android.arch.lifecycle:viewmodel:$lifecycle_version" // use -ktx for Kotlin
// alternatively - just LiveData
implementation "android.arch.lifecycle:livedata:$lifecycle_version"
// alternatively - Lifecycles only (no ViewModel or LiveData).
// Support library depends on this lightweight import
implementation "android.arch.lifecycle:runtime:$lifecycle_version"
annotationProcessor "android.arch.lifecycle:compiler:$lifecycle_version" // use kapt for Kotlin
// alternately - if using Java8, use the following instead of compiler
implementation "android.arch.lifecycle:common-java8:$lifecycle_version"
// optional - ReactiveStreams support for LiveData
implementation "android.arch.lifecycle:reactivestreams:$lifecycle_version"
// optional - Test helpers for LiveData
testImplementation "android.arch.core:core-testing:$lifecycle_version"
}
2.使用LiveData持有数据
这里使用的是LiveData的子类 MutableLiveData
package com.architecture.demo.liveData;
import android.arch.lifecycle.MutableLiveData;
import java.util.List;
public class DataFetch {
private MutableLiveData<String> mCurrentName;
private MutableLiveData<List<String>> mNameListData;
public MutableLiveData<String> getCurrentName() {
if (mCurrentName == null) {
mCurrentName = new MutableLiveData<>();
}
return mCurrentName;
}
public MutableLiveData<List<String>> getNameList() {
if (mNameListData == null) {
mNameListData = new MutableLiveData<>();
}
return mNameListData;
}
}
3.在Activity中注册观察者,观察数据的变化,跟进数据的变化更新UI
package com.architecture.demo;
import android.arch.lifecycle.Observer;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import com.architecture.demo.liveData.DataFetch;
import com.architecture.demo.liveData.NetWorkLiveData;
import com.architecture.demo.util.CONSTANT;
import java.util.ArrayList;
import java.util.List;
public class LiveDataActivity extends AppCompatActivity {
public static int NUM = 0;
private TextView text;
private TextView text1;
private DataFetch mDataFetch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_live_data);
text = findViewById(R.id.text);
text1 = findViewById(R.id.text1);
NUM = 0;
initData();
}
private void initData() {
mDataFetch = new DataFetch();
mDataFetch.getCurrentName().observe(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
text.setText(s);
}
}); // 注册观察者,观察LiveData持有的数据变化并做出响应
mDataFetch.getNameList().observe(this, new Observer<List<String>>() {
@Override
public void onChanged(@Nullable List<String> strings) {
StringBuilder tmp = new StringBuilder();
if (strings != null) {
for (String item : strings) {
tmp.append(item).append(",");
}
}
Log.i(CONSTANT.TAG_LIVE_DATA, tmp.toString());
}
}); // 注册观察者,观察LiveData持有的数据变化并做出响应
}
public void changeName(View view) {
mDataFetch.getCurrentName().setValue("name" + NUM);
NUM++;
}
public void changeList(View view) {
List<String> list = new ArrayList<>();
for (int i = 0; i < NUM; i++) {
list.add("list" + i);
}
mDataFetch.getNameList().setValue(list);
NUM++;
}
public void registerNetStatus(View view) {
NetWorkLiveData.getInstance(getApplicationContext()).observe(this, new Observer<Integer>() {
@Override
public void onChanged(@Nullable Integer integer) {
if (null == integer) {
Log.i(CONSTANT.TAG_LIVE_DATA, "onChanged:null");
return;
}
Log.i(CONSTANT.TAG_LIVE_DATA, "onChanged:" + integer);
String s = "无网络";
if (integer == ConnectivityManager.TYPE_MOBILE) {
s = "手机网络";
} else if (integer == ConnectivityManager.TYPE_WIFI) {
s = "WIFI网络";
} else if (integer == -1) {
s = "无网络";
}
text1.setText(String.format("网络状态:%s", s));
}
});
}
public void unregisterNetStatus(View view) {
NetWorkLiveData.getInstance(getApplicationContext()).removeObservers(this);
}
}
通过以上步骤既可完成LiveData的简单使用。
Demo地址:
https://github.com/CongYiMing/ArchitectureDemo
网友评论