我在Andrid Studio中编写程序,并且将Room与Sqlite一起使用。我有一个Entity,以及相应的Dao。
谈论具有两列键和值的表键。在道我有
public interface KeyDao {
@Insert
void insert(Key key);
@Update
void update(Key key);
@Delete
void delete(Key key);
@Query("DELETE FROM key_table")
void deleteAllkeys();
@Query("SELECT * FROM key_table ORDER BY id DESC")
LiveData<List<Key>> getAllkeys();}
在onCreate的主要活动中,我做了两件事:
我得到所有表行 我设置了关于行的片段 为了获取所有行,我们设置了一个观察器并检测onChange
keyViewModel = ViewModelProviders.of(this).get(KeyViewModel.class);
keyViewModel.getAllKeys().observe(this, new Observer<List<Key>>() {
@Override
public void onChanged(@Nullable List<Key> all_key_rows) {
Giveme_all_the_rows = all_key_rows;
}
});
为了显示Fragment,我们调用FragmentManager
if (savedInstanceState == null) {
// If some rows do this BUT I FIND ROWS EMPTY!!
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
new MyFragment()).commit();
现在,这两个任务在Activity onCreate(Bundle savedInstanceState)中
我想在声明onChange之后立即阅读Giveme_all_the_rows变量,但发现它为空,我想立即阅读以显示关于某些行的Fragment
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在你的场景中,你希望在onChanged
回调被触发后立即使用Giveme_all_the_rows
变量,并基于这个数据来显示Fragment。但是,由于LiveData的异步性质,onChanged
可能不会在你期望的同步顺序中立即执行。这意味着在onCreate
方法里直接使用Giveme_all_the_rows
可能会因为数据尚未加载完成而得到空值。
为了确保Fragment只在数据可用时才加载并显示,你可以将Fragment的替换操作放在onChanged
回调内。这样可以确保只有当LiveData中的数据准备好时,才会进行UI的更新。下面是一个修改后的示例:
keyViewModel = ViewModelProviders.of(this).get(KeyViewModel.class);
keyViewModel.getAllKeys().observe(this, new Observer<List<Key>>() {
@Override
public void onChanged(@Nullable List<Key> all_key_rows) {
if (all_key_rows != null) {
// 当数据可用时,再进行Fragment的替换操作
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container, MyFragment.newInstance(all_key_rows)) // 如果需要,可以通过newInstance传递数据给Fragment
.commit();
}
}
});
// 注意:这里不再在onCreate中直接调用Fragment的替换操作
在这个修改中,我们移除了在onCreate
中直接调用getSupportFragmentManager().beginTransaction()
的部分,而是将其放入了onChanged
回调内部。这样就确保了Fragment的展示会等待数据准备完毕,避免了因数据未加载完成而导致的空值问题。
如果你的MyFragment
需要这些数据,你还可以通过Fragment的工厂方法(如上述代码中的newInstance
)或者使用Bundle
来传递数据给Fragment。这样,Fragment在创建时就可以接收到从Activity传来的数据,并据此进行初始化和展示。