- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我对来自新 Android 架构组件的 LiveData 有疑问。我以前使用过 ObservableField,但想尝试 ACC。
当我在 Activity 中的一个方法中通过 MutableLiveData.setValue 设置值 4 次时,我只收到一次 onChange 调用,当我使用 ObservableField 而不是它时,它按我预期的方式工作 - 它命中回调 4 次。
为什么 LiveData 不会为每个单独的 setValue 触发 onChange?
View 模型:
public class MainViewModel extends AndroidViewModel {
MutableLiveData<Boolean> booleanMutableLiveData;
ObservableField<Boolean> booleanObservableField;
public MainViewModel(@NonNull Application application) {
super(application);
booleanMutableLiveData = new MutableLiveData<>();
booleanObservableField = new ObservableField<>();
}
public void changeBool()
{
booleanMutableLiveData.setValue(false);
booleanObservableField.set(false);
booleanMutableLiveData.setValue(true);
booleanObservableField.set(true);
booleanMutableLiveData.setValue(false);
booleanObservableField.set(false);
booleanMutableLiveData.setValue(true);
booleanObservableField.set(true);
}
}
和 Activity :
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final MainViewModel mainViewModel = ViewModelProviders.of(this).get(MainViewModel.class);
mainViewModel.booleanMutableLiveData.observe(this, new Observer<Boolean>() {
@Override
public void onChanged(@Nullable Boolean aBoolean) {
Log.e("Mutable Value", String.valueOf(aBoolean));
}
});
mainViewModel.booleanObservableField.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() {
@Override
public void onPropertyChanged(Observable sender, int propertyId) {
Log.e("Observable value", String.valueOf(mainViewModel.booleanObservableField.get()));
}
});
mainViewModel.changeBool();
}
}
堆栈跟踪:
10-20 13:34:17.445 1798-1798/com.example.livedatasample E/Observable value: false
10-20 13:34:18.588 1798-1798/com.example.livedatasample E/Observable value: true
10-20 13:34:19.336 1798-1798/com.example.livedatasample E/Observable value: false
10-20 13:34:19.994 1798-1798/com.example.livedatasample E/Observable value: true
10-20 13:34:20.892 1798-1798/com.example.livedatasample E/Mutable Value: true
最佳答案
LiveData 具有生命周期意识。在您的情况下,您正在更改其在 onCreate 中的值 - liveData 将在 Activity 启动时调用其观察者(在本例中恰好一次)。
LiveData considers an observer, which is represented by the Observer class, to be in an active state if its lifecycle is in the STARTED or RESUMED state. LiveData only notifies active observers about updates. Inactive observers registered to watch LiveData objects aren't notified about changes. https://developer.android.com/topic/libraries/architecture/livedata
关于android - 奇怪的 LiveData 行为与 ObservableField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46848609/
我正在试用 Realm 以及包括 LiveData 在内的 Android 架构组件。 我一直在关注 Google 的应用程序架构指南: https://developer.android.com/t
我有两个 DAO、两个存储库和两个 POJO。有什么方法可以创建两个的一个 Livedata?我需要它来为 Recyclerview 制作单个列表。POJO 是类似的对象。 费用库: public c
使用PagedList,这里没有数据库备份,而是内存中的数据列表(称其为CachedDataList),可以通过fetchMore()填充功能。 有了 PositionalDataSource、Dat
我正在创建具有MVVM架构的应用程序,但遇到了一个问题:获取要在View中显示的LiveData列表。 在我的ViewModel中,我有一个getAll()函数,该函数使用Room从数据库中检索字符串
我有一个包含用户列表的 LiveData 对象,我正在尝试将数据传输到另一个 LiveData 对象以在其他地方使用。 我在 Room 中使用 MVVM,所以我从数据库和 ViewModel 中获取
我是测试新手,我想学习如何使用 MVVM 模式测试协程。我刚刚关注了 https://github.com/android/architecture-samples 项目并做了一些更改(删除了远程源)
我在存储库类中有一个方法如下,它从本地数据库或网络返回国家列表作为 LiveData: fun loadCountries(): LiveData>> { return object : Ne
official Android developer docs 中的协程 LiveData 示例使用 emit() 给出以下示例: val user: LiveData = liveData {
在文字游戏应用中,我在 Activity 和 fragment 之间共享一个模型: public class MainViewModel extends AndroidViewModel {
我正在尝试对一个 View 进行数据绑定(bind),该 View 应该显示通过 View 模型中的 LiveData 属性公开的数据,但我发现无法将 LiveData 内的对象绑定(bind)到 V
使用 lifecycle-viewmodel-ktx和 lifecycle-livedata-ktx并给出以下示例: ViewModel 实现: class AutocompletionViewMod
我正在尝试合并 Android Architecture GitHub example与数据绑定(bind)。为此,我想我必须在 UserViewModel 中添加一个从 LiveData> 到 Li
我需要将域对象映射到 UI 对象并使用实时分页列表显示。 我试图映射 LiveData>至 LiveData>和 map PositionalDataSource至 PositionalDataSou
假设我们有两个 LiveData 对象: LiveData> fooList; LiveData> barList; 并且可以通过某种方法(或构造函数)将 Foo 转换为 Bar 对象。将具有 Foo
我想使用 MutableLiveData 观察来自 ViewModel 的一些数据。问题是我使用子类和父类,并且与 LiveData 存在一些不兼容。我想在 Kotlin 中做的事情的一个例子: im
在 Java 中,我们访问 Livedata> 的第一个元素书籍使用 books[0] ,如何在 Kotlin 中做到这一点? 我已经尝试了一切。 //Java代码 books[0]; // Kotl
我阅读了许多关于 viewmodel 和 livedata 的教程,但我并没有在 mvvm 模式的 viewmodel 类中实际使用 livedata。提前致谢。 最佳答案 Android 开发人员通
我正在创建一个 TODO 列表应用程序,用户可以在其中添加要执行的任务。任务有几类。我有以下情况: viewModelMainActivity = new ViewModelProvi
我正在使用 Kotlin 和 Android 架构组件(LiveData 和 Room)制作一个 Android 应用。 我有一个显示用户的 Activity (存储在数据库中并使用带有 ViewMo
我在我的存储库中使用 AsyncTask,它用于设置存储库中的 LiveData。我如何使用转换从我的 ViewModel 观察这个 LiveData? 最佳答案 你可以忽略我的另一个答案。解决方案是
我是一名优秀的程序员,十分优秀!