01LiveData基础之基本用法附带demo

01LiveData基础之基本用法附带demo
02Lifecycle-LiveData基础之自定义livedata附带demo
03Lifecycle-LiveData基础之map使用附带demo
04Lifecycle-LiveData基础之配合room 或者配合协程使用附带demo

介绍 及官方文档

LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。

官方文档

个人理解:livedata 专注于数据 可以通过observe()监听数据的变化(不限于基本的数据类型 对象也可以)

1.导入
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0"

具体最新版本可以去官网查

2.基本用法
//创建一个key值  "string"为默认值
val key = MutableLiveData("string")

//获取 值
key.getValue()

//key值更改为 "新值"  官方 建议setValue 只在主线程使用
key.setValue("新值")

//key值更改为 "postValue 值"  官方 建议不在主线程时  要使用 postValue 更改值
key.postValue("postValue 值")

//给key 增加监听  当key中的值改变时 则会走回调  observe() 第一个参数  LifecycleOwner 传入 activity/Fragment/Service  
//LifecycleOwner不在本章节讨论  可以看Lifecyc(具体就是标记了各个生命周期)
key.observe(this@MainActivity,
            Observer<String> { Toast.makeText(this@MainActivity, it, Toast.LENGTH_LONG).show()})

3.setValue()和postValue的区别

干了这碗源码


protected void postValue(T value) {
        boolean postTask;
        synchronized (mDataLock) {
            postTask = mPendingData == NOT_SET;
            mPendingData = value;
        }
        if (!postTask) {
            return;
        }
        ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);
    }

 @MainThread
    protected void setValue(T value) {
        assertMainThread("setValue");
        mVersion++;
        mData = value;
        dispatchingValue(null);
    }

//可以看到 postvalue 增加 synchronized  线程安全   postvalue 饶了一圈 最后还是调用了 setValue 

//我在测试的时候 setValue  在子线程调用 会抛出异常  Cannot invoke setValue on a background thread 

4.observe 添加订阅(数据监听器)
 
//ComponentActivity 和 fragment 都实现了这个接口 
public interface LifecycleOwner {
    /**
     * Returns the Lifecycle of the provider.
     *
     * @return The lifecycle of the provider.
     */
    @NonNull
    Lifecycle getLifecycle();
}

//这个是LiveData的订阅部分源码
//可以看到 owner.getLifecycle().getCurrentState() == DESTROYED 就return了  
//DESTROYED 基本标记生命周期销毁了 
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
        assertMainThread("observe");
        if (owner.getLifecycle().getCurrentState() == DESTROYED) {
            // ignore
            return;
        }
        LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
        ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
        if (existing != null && !existing.isAttachedTo(owner)) {
            throw new IllegalArgumentException("Cannot add the same observer"
                    + " with different lifecycles");
        }
        if (existing != null) {
            return;
        }
        owner.getLifecycle().addObserver(wrapper);
    }



代码:
Demo01

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值