开发者社区 问答 正文

房间观察员的速度不够快吗?我可以等待onChange执行吗?

我在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

展开
收起
几许相思几点泪 2019-12-16 20:28:53 456 分享 版权
阿里云 AI 助理回答

在你的场景中,你希望在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传来的数据,并据此进行初始化和展示。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: