LiveData在使用SyncAdapter/不同线程更新时不会观察到更改



我有一个SyncAdapter,它插入消息:

public class SyncAdapter extends AbstractThreadedSyncAdapter {
@Override
public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) {
messageDAO.insert(..);
}
}

我有一个"活动",它显示这些消息的过滤部分:

protected Observer<List<MessageEntity>> messageOberserver;
@Override
protected void onCreate(Bundle savedInstanceState) {
this.messageOberserver = new Observer<List<MessageEntity>>() {
@Override
public void onChanged(List<MessageEntity> messages) {
Log.v("tmp", "messages have changed");
messageAdapter.setData(messages);
}
}
MessageViewModel messageViewModel = ViewModelProviders.of(this).get(MessageViewModel.class);
messageDAO.findMessagesForTopic(this.topicId).observe(this, this.messageOberserver);
}
DAO:
@Query("SELECT * FROM Message WHERE messageTopicId = :topicId")
LiveData<List<MessageEntity>> messageDAO.findMessagesForTopic(String topicId);

现在的问题是观察者无法识别对消息表的更改。如果我重新打开活动,则会显示更改。SyncAdapter告诉"活动"它应该检查更改的正确方式是什么?我读过postValue((,但不知道如何使用它。SyncAdapter不知道Activity显示的部分Message数据。

--

Btw。如果我从其他地方(而不是SyncAdapter(更新,代码就会工作。

这可能是在另一个进程中运行同步适配器的结果,同步适配器服务文档默认会指导该进程。尝试从AndroidManifest.xml中的服务中删除android:process=":sync或类似行。这将在与应用程序活动相同的过程中运行同步适配器。

您正在构建messageOberserver[sic](messageObserver(

this.messageOberserver = ...

在将其传递到observe函数之后

observe(this, this.messageOberserver)

此时您的观察者为空。因此,构造的观测者永远不会被注册,也永远不会被调用。

如果使用Room和多个进程,请确保启用enableMultiInstanceInvalidation以支持进程之间的更新通知。

fun getDatabase(context: Context): AppDatabase {
return synchronized(this) {
if (!Companion::INSTANCE.isInitialized) {
val instance = Room.databaseBuilder(
context,
AppDatabase::class.java,
"media"
)
// TODO support migrations
.fallbackToDestructiveMigration()
.enableMultiInstanceInvalidation()
.build()
INSTANCE = instance
}
INSTANCE
}
}

相关内容

  • 没有找到相关文章

最新更新