欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android LiveData使用需要注意的地方

 更新時間:2021年03月29日 09:37:22   作者:金宇世界  
這篇文章主要介紹了Android LiveData使用需要注意的地方,幫助大家更好的理解和學習使用Android,感興趣的朋友可以了解下

關于LiveData是什么以及基本使用方式,請參考官方文檔:developer.android.com/topic/libra…

簡單來說,LiveData是一個可被觀察的數據容器類。它將數據包裝起來,使得數據成為“被觀察者”,頁面成為“觀察者”。當ViewModel存放頁面所需要的各種數據發(fā)生變化時,通過LiveData的方式實現對頁面的通知,完成ViewModel與頁面組件之間的通信。

那么在使用時發(fā)現有以下幾個地方需要注意:

1.回調通知

LiveData的觀察者會在每次進入活躍態(tài)時收到回調,如果只想收到一次回調的話,可以使用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的粘性特性引發(fā)的,因此在使用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 系統(tǒng)實現多種開機動畫和logo切換功能

    Android 系統(tǒng)實現多種開機動畫和logo切換功能

    這篇文章主要介紹了android 系統(tǒng)實現多種開機動畫和logo切換功能,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-12-12
  • Android 多進程資料總結

    Android 多進程資料總結

    這篇文章主要介紹了Android 多進程資料總結的相關資料,需要的朋友可以參考下
    2016-09-09
  • Android 虛擬按鍵適配動態(tài)調整布局的方法

    Android 虛擬按鍵適配動態(tài)調整布局的方法

    今天小編就為大家分享一篇Android 虛擬按鍵適配動態(tài)調整布局的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • arcgis android之定位功能的示例代碼

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

    這篇文章主要介紹了arcgis android之定位功能的示例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Android 一鍵清理、內存清理功能實現

    Android 一鍵清理、內存清理功能實現

    這篇文章主要介紹了Android 一鍵清理、內存清理功能實現,非常具有實用價值,需要的朋友可以參考下。
    2017-01-01
  • Android布局優(yōu)化之ViewStub控件

    Android布局優(yōu)化之ViewStub控件

    ViewStub是一個非常輕量級的View,這篇文章主要為大家詳細介紹了Android布局優(yōu)化之ViewStub控件的使用方法以及注意事項,感興趣的小伙伴們可以參考一下
    2016-05-05

最新評論