Android LiveData使用需要注意的地方

 更新时间:2021年03月29日 09:37:22   作者:金宇世界  
这篇文章主要介绍了Android LiveData使用需要注意的地方,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

关于LiveData是什么以及基本使用方式,请参考官方文档:developer.android.com/topic/libra…

简单来说,LiveData是一个可被观察的数据容器类。它将数据包装起来,使得数据成为“被观察者”,页面成为“观察者”。当ViewModel存放页面所需要的各种数据发生变化时,通过LiveData的方式实现对页面的通知,完成ViewModel与页面组件之间的通信。

那么在使用时发现有以下几个地方需要注意:

1.回调通知

LiveData的观察者会在每次进入活跃态时收到回调,如果只想收到一次回调的话,可以使用SingleLiveEvent。要注意SingleLiveEvent仅限于一个观察者。如果添加了多个则只会调用一个,并且不能保证哪一个。

2.数据倒灌

所谓数据倒灌是一种形象的说法,它是指先setValue/postValue,后调用observe(new Obs()),至此收到了回调。然后再调用observe(new anotherObs()),如果还能收到第一次的回调,也就是旧数据。解决方案可以参考开源项目:UnPeek-LiveData

3.事件包装

上面提到SingleLiveEvent仅限于一个观察者,如果需要多个观察者该如何处理呢,方案就是使用事件包装。定义一个数据包装器,内部判断事件是否消费了,被消费后则不再回调通知。代码如下:

/**
* 事件包装器,明确地管理事件是否已经被处理
* @param <T> ViewModel中的数据,比如: 
* MutableLiveData<LiveEventWrapper<String>>()
*/
public class LiveEventWrapper<T> {

  private T content;
  private boolean hasBeenHandled;

  public LiveEventWrapper(T content) {
    this.content = content;
  }

  /**
   * Returns the content and prevents its use again.
   */
  public T getContentIfNotHandled() {
    if (hasBeenHandled) {
      return null;
    } else {
      hasBeenHandled = true;
      return content;
    }
  }

  /**
   * Returns the content, even if it's already been handled.
   */
  public T peekContent() {
    return content;
  }

  public boolean isHasBeenHandled() {
    return hasBeenHandled;
  }

}

或者

import androidx.annotation.NonNull;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.Observer;

public class CleanLiveData<T> extends LiveData<T> {
  private boolean hasModified = false;

  @Override
  public void observe(@NonNull LifecycleOwner owner, @NonNull final Observer<? super T> observer) {
    super.observe(owner, new Observer<T>() {
      private boolean hasIntercept = false;

      @Override
      public void onChanged(T t) {
        if (!hasModified || hasIntercept) {
          observer.onChanged(t);
        }
        hasIntercept = true;
      }
    });
  }

  @Override
  public void observeForever(@NonNull final Observer<? super T> observer) {
    super.observeForever(new Observer<T>() {
      private boolean hasIntercept = false;

      @Override
      public void onChanged(T t) {
        if (!hasModified || hasIntercept) {
          observer.onChanged(t);
        }
        hasIntercept = true;
      }
    });
  }

  @Override
  public void setValue(T value) {
    super.setValue(value);
    hasModified = true;
  }

  @Override
  public void postValue(T value) {
    super.postValue(value);
    hasModified = true;
  }

}

总结来看,以上现象基本都是由于LiveData的粘性特性引发的,因此在使用LiveData的时一定要搞清楚它的概念和原理。

以上就是Android LiveData使用需要注意的地方的详细内容,更多关于Android LiveData使用的资料请关注脚本之家其它相关文章!

相关文章

  • Flutter 构建一个常用的页面框架

    Flutter 构建一个常用的页面框架

    大多数 App 中都会有底部导航栏,通过底部导航栏切换实现不同页面之间的切换。在Flutter 中提供了 BottomNavigationBar组件实现底部导航。本篇介绍通过 BottomNavigationBar和 IndexedStack构建最为常见的 App 页面框架。
    2021-05-05
  • Android自定义荷载进度的两种方法

    Android自定义荷载进度的两种方法

    进度条在App中非常常见,例如下载进度、加载图片、打开文章、打开网页等等……本篇文章主要介绍了Android自定义荷载进度的两种方法,有需要的朋友可以了解一下。
    2016-10-10
  • 详解Android ConstraintLayout 约束布局的用法

    详解Android ConstraintLayout 约束布局的用法

    本篇文章主要介绍了详解Android ConstraintLayout 约束布局的用法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • Android仿新浪微博自定义ListView下拉刷新(4)

    Android仿新浪微博自定义ListView下拉刷新(4)

    这篇文章主要为大家详细介绍了Android仿新浪微博自定义ListView下拉刷新,重点介绍了Adapter的详细代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Android 系统实现多种开机动画和logo切换功能

    Android 系统实现多种开机动画和logo切换功能

    这篇文章主要介绍了android 系统实现多种开机动画和logo切换功能,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-12-12
  • Android 多进程资料总结

    Android 多进程资料总结

    这篇文章主要介绍了Android 多进程资料总结的相关资料,需要的朋友可以参考下
    2016-09-09
  • Android 虚拟按键适配动态调整布局的方法

    Android 虚拟按键适配动态调整布局的方法

    今天小编就为大家分享一篇Android 虚拟按键适配动态调整布局的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • arcgis android之定位功能的示例代码

    arcgis android之定位功能的示例代码

    这篇文章主要介绍了arcgis android之定位功能的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Android 一键清理、内存清理功能实现

    Android 一键清理、内存清理功能实现

    这篇文章主要介绍了Android 一键清理、内存清理功能实现,非常具有实用价值,需要的朋友可以参考下。
    2017-01-01
  • Android布局优化之ViewStub控件

    Android布局优化之ViewStub控件

    ViewStub是一个非常轻量级的View,这篇文章主要为大家详细介绍了Android布局优化之ViewStub控件的使用方法以及注意事项,感兴趣的小伙伴们可以参考一下
    2016-05-05

最新评论