美文网首页
Andorid LiveData介绍

Andorid LiveData介绍

作者: Yim_ | 来源:发表于2018-09-26 07:55 被阅读0次

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

相关文章

网友评论

      本文标题:Andorid LiveData介绍

      本文链接:https://www.haomeiwen.com/subject/vnofoftx.html