我有一个 viewModel 和一个运行良好的观察者。事实上,太好了,因为即使我好意地请求,观察者也拒绝被移除。
有人能看出哪里出了问题吗?
这是我尝试过的:
MyViewModel viewModel = new ViewModelProvider(this).get(MyViewModel.class);
final Observer<List<String>> my_observer = new Observer<List<String>>() {
@Override
public void onChanged(List<String> firstNames) {
... some code ...
}
};
viewModel.getFirstNames(lastName).observe(this,my_observer);
viewModel.getFirstNames(lastName).removeObserver(my_observer);
我也尝试过
removeObservers(this,my_observer)
,但是只要更改、添加或删除其中一个“firstName”(并且“lastName”保持不变),my_observer 中的代码就会运行。
在 stackoverflow 上有很多关于这个问题的问题,我花了几个小时(甚至可能是几天)阅读、搜索和尝试,但我找到的问题和答案都没有解决我的问题,因为其他人缺乏对问题的输入viewModel(此处为“lastName”)。
这里有更多所要求的代码 - 它工作得很好,因为我确实得到了所有的名字。 ;-)
--- MyViewModel ---
public class MyViewModel extends AndroidViewModel {
public static MyRepository myRepository;
public MyViewModel(@NonNull Application application) {
super(application);
myRepository = new MyRepository(application);
}
public LiveData<List<String>> getFirstNames(String lastName){
return myRepository.getFirstNames(lastName);
}
}
--- 我的存储库 ---
public class MyRepository {
private final MyDao myDao;
public MyRepository(Application application) {
MyRoomDatabase db = MyRoomDatabase.getDatabase(application);
myDao = db.myDao();
}
public LiveData<List<String>> getFirstNames(String lastName){
return myDao.getFirstNames(lastName);
}
}
--- MyDao ---
@Dao
public interface MyDao {
@Query("SELECT * FROM table_names AS tn " +
"WHERE tn.lastname LIKE :lastName " +
"ORDER BY tn.firstname ASC")
LiveData<List<String>> getFirstNames(String lastName);
}
当你最终寻求帮助时,经常会发生一件有趣的事情:你往往会自己弄清楚......
我已经初始化了我的观察者,但没有初始化我的 LiveData 实例。因此,我创建了一个无法删除的匿名 LiveData 实例。
这最终对我有用:
MyViewModel viewModel = new ViewModelProvider(this).get(MyViewModel.class);
// Store the LiveData instance in a variable
LiveData<List<String>> liveNames = viewModel.getFirstNames(lastName);
// Observe the LiveData
liveName.observe(this, names -> {
... some code ...
// Remove all observers for the liveData instance
liveNames.removeObservers(this);
});
希望它对某人有帮助;-)