android - 如何在广播接收器中访问MyViewModel(AndroidViewModel)

标签 android broadcastreceiver android-viewmodel

我最近在我的 Android 应用程序中实现了 Room。 (https://developer.android.com/training/data-storage/room)

它在 Activity 中运行良好。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mWritedSMSViewModel = new ViewModelProvider(this).get(WritedSMSViewModel.class);
    mWritedSMSViewModel.getAllWritedSMSs().observe(this, new Observer<List<WritedSMS>>() {
        @Override
        public void onChanged(@Nullable final List<WritedSMS> smss) {
            // Update the cached copy of the words in the adapter.
            if(smss != null) {
                mAdapter.setSMSs(smss);
            }
        }
    });

但是我无法使用 BroadcastReciever 中的 Room

mWritedSMSViewModel = new ViewModelProvider(???).get(WritedSMSViewModel.class);

问题是我不知道上面的代码应该使用什么参数。 我确认 thiscontext 不能用作参数。

我这是怎么了?

最佳答案

You shouldn't do that. It's bad practice. Because ViewModels only attached with Activity and Fragment Only.

有一件事可以满足您的要求。

在单独的 singleton 类中将 Room DB 操作与 ViewModel 分开。在 ViewModel 和任何其他需要的地方使用它。当接收到Broadcast时,通过这个单例类而不是ViewModel将数据写入DB。

如果您正在观察 Fragment 中的 LiveData,那么它也会更新您的 View 。

关于android - 如何在广播接收器中访问MyViewModel(AndroidViewModel),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57905709/

相关文章:

android - 应用程序卸载时无法获取接收器

java - 如何从服务中的 Room 数据库读取数据并监听更改?

java - 将 float 数组保存到SD卡(java)

java - 获取在 void 方法中生成的随机数的名称

java - onReceive() 回调中的同步块(synchronized block)

Android在 fragment 和对话框 fragment 之间共享ViewModel?

android - 使用 Android 数据绑定(bind)在 EditText text.length() > 0 时启用按钮

android - 为什么滚动时工具栏不隐藏?

Android 模拟器强制关闭我的应用程序

android - 将参数从 Activity 传递到 BroadcastReceiver