我有一个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
}
}