Android

关注公众号 jb51net

关闭
首页 > 软件编程 > Android > Android架构组件LiveData

Android架构组件LiveData使用详解

作者:ttylinux

这篇文章主要介绍了Android架构组件LiveData使用详解的相关资料,需要的朋友可以参考下

LiveData

LiveData是基于观察者模式创建的,其中,LiveData是被观察者,观察者通过注册方法,监听被观察者的数据变化。LiveData在数据发生变化的时候,会通知观察者。

LiveData是一个容器,存放数据的容器,它的数据变化可以被监听,也就是LiveData是一个被观察者,如下,创建了一个存放String的数据容器currentName:

public class NameViewModel extends ViewModel {
// Create a LiveData with a String
private MutableLiveData<String> currentName;
   public MutableLiveData<String> getCurrentName() {
       if (currentName == null) {
           currentName = new MutableLiveData<String>();
       }
       return currentName;
   }
// Rest of the ViewModel...
}

监听LiveData数据变化,为LiveData添加观察者,如下,添加一个nameObserver,监听LiveData的数据变化,当LiveData的数据发生变化的的时候,onChanged方法会被回调,从而更新UI。

public class NameActivity extends AppCompatActivity {
   private NameViewModel model;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       // Other code to setup the activity...
       // Get the ViewModel.
       model = new ViewModelProvider(this).get(NameViewModel.class);
       // Create the observer which updates the UI.
       final Observer<String> nameObserver = new Observer<String>() {
           @Override
           public void onChanged(@Nullable final String newName) {
               // Update the UI, in this case, a TextView.
               nameTextView.setText(newName);
           }
       };
       // Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
       model.getCurrentName().observe(this, nameObserver);
   }
}

更新LiveData数据的方式,使用setValue和postValue两个方法

LiveData发布修改有setValue和postValue两种方式,其中setValue只能在主线程调用,postValue则没有这个限制

button.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
       String anotherName = "John Doe";
       model.getCurrentName().setValue(anotherName);
   }
});

应用架构中的LiveData

LiveData 具有生命周期感知能力,遵循 activity 和 fragment 等实体的生命周期。您可以使用 LiveData 在这些生命周期所有者和生命周期不同的其他对象(例如 ViewModel 对象)之间传递数据。ViewModel 的主要责任是加载和管理与界面相关的数据,因此非常适合作为用于保留 LiveData 对象的备选方法。您可以在 ViewModel 中创建 LiveData 对象,然后使用这些对象向界面层公开状态。

 activity 和 fragment 不应保留 LiveData 实例,因为它们的用途是显示数据,而不是保持状态。此外,如果 activity 和 fragment 无需保留数据,还可以简化单元测试的编写。

扩展LiveData

如果观察者的生命周期处于 STARTED 或 RESUMED 状态,LiveData 会认为该观察者处于活跃状态。以下示例代码说明了如何扩展 LiveData 类

public class StockLiveData extends LiveData<BigDecimal> {
    private StockManager stockManager;


    private SimplePriceListener listener = new SimplePriceListener() {
        @Override
        public void onPriceChanged(BigDecimal price) {
            setValue(price);
        }
    };


    public StockLiveData(String symbol) {
        stockManager = new StockManager(symbol);
    }


    @Override
    protected void onActive() {
        stockManager.requestPriceUpdates(listener);
    }


    @Override
    protected void onInactive() {
        stockManager.removeUpdates(listener);
    }
}

当LiveData对象具有活跃观察者时, 会调用 onActive() 方法。这意味着,您需要从此方法开始观察股价更新。

当 LiveData 对象没有任何活跃观察者时,会调用 onInactive() 方法。由于没有观察者在监听,因此没有理由与 StockManager 服务保持连接。

setValue(T) 方法将更新 LiveData 实例的值,并将更改告知活跃观察者。

LiveData使用总结

LiveData的优点

LiveData源码分析:

public interface Observer<T> {
  /**
   * Called when the data is changed.
   * @param t  The new data
   */
  void onChanged(@Nullable T t);
}
// 注意,他是 abstract class
public abstract class LiveData<T> {
  // 只有 onStart 后,对数据的修改才会触发 observer.onChanged()
  public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {}
  // 无论何时,只要数据发生改变,就会触发 observer.onChanged()
  public void observeForever(@NonNull Observer<T> observer) {}
}

到此这篇关于Android架构组件LiveData使用详解的文章就介绍到这了,更多相关Android架构组件LiveData内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文