我不知道这是不是一个愚蠢的问题。这可能会破坏LiveData / ViewModel的目的。
我可以将LiveData设为静态吗?我的理由是我有一个来自服务的监听器来更新信息。所以我需要从服务到“设置/更改”LiveData。
我曾经做过以下工作:
1.服务更改数据库
2. ViewModel监听DB更改
3.来自liveData的UI更新
我发现这种方式太慢了。为了提高性能,我想要这样的东西:
1.服务直接更改类对象
2. ViewModel监听类对象的变化
3.来自liveData的UI更新
为了实现我想要的,要么我需要使MutableLiveData静态,要么让ViewModel类在Activities之间共享ViewModel的相同实例。
这是个好主意吗?
public class MyViewModel extends AndroidViewModel {
// Note: this MutableLiveData is static
private static MutableLiveData<MyModel> mutableLiveData;
public MyViewModel(@NonNull Application application) {
super(application);
}
LiveData<MyModel> getLiveDataList() {
if (mutableLiveData == null) {
mutableLiveData = new MutableLiveData<>();
loadDataFromDb();
}
return mutableLiveData;
}
private void loadDataFromDb() {
// load data from DB
// mutableLiveData.setValue(MyModelFromDb); // Omit the real implementation
}
// Note: this method is static
public static void setData(MyModel newData) {
mutableLiveData.setValue(newData);
}
@Override
protected void onCleared() {
super.onCleared();
}
}
答案 0 :(得分:0)
Android Jetpack的cd $BIGTMP
curl -O http://ftp.gnu.org/gnu/make/make-4.2.1.tar.gz
tar xvf make-4.2.1.tar.gz
cd make-4.2.1
./configure --prefix=/opt/make && make && make install
export PATH=/opt/make/bin:$PATh
ln -s /opt/make/bin/make /opt/make/bin/gmake
(相对于其他版本)的重点是ViewModel
具有生命周期意识,并且在观察者被销毁(活动/碎片)时执行销毁自己的余地,或保留配置更改(例如方向)而无需重新初始化自身,从而使处理与配置更改相关的问题变得更加容易。
因此,如果您将ViewModel
或ViewModel
设为静态,则实际上您会实现它们的目的,并且尽管尝试这样做是可以理解的,但我当然希望它会崩溃并出错。因此,这需要您围绕它进行设计,而您提到的第一种方法可能是实现它的最佳方法。我不明白您为什么对第一个解决方案有疑问。我的看法是,它提供了最佳的用户体验:
LiveData
的片段或活动中初始化ViewModel
,并将onCreate
添加到数据中。Observer
中数据的更新据我所知,没有比这更好的了。由于您的问题是几个月前提出的,我很想知道您最终在做什么?
答案 1 :(得分:0)
MyViewModel
将有许多LiveData
字段,它将随着大量的getter和setter而增长。而且就我而言,更糟糕的是,您将破坏代码的可验证性,因为如果您要创建MyViewModel
的新实例,您将期望此时的LiveData
对象是无状态的,但是由于它是静态对象,因此您不知道它在简单创建后的确切状态。但这只是我的看法。