如何解决使用SyncAdapter /不同的线程更新时,LiveData不会观察到更改
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告诉Activity应该检查更改的正确方法是什么?我读了有关postValue()的文章,但我不知道如何使用它。 SyncAdapter不知道活动显示的部分消息数据。
-
顺便说一句。如果我从其他地方(不是SyncAdapter)更新,则该代码有效。
解决方法
这可能是由于在另一个进程中运行同步适配器而导致的,默认情况下,同步适配器服务文档会将其引导。尝试从AndroidManifest.xml中的服务中删除android:process=":sync
或类似的行。这将在与您的应用程序活动相同的过程中运行同步适配器。
您正在构建messageOberserver
[原文如此(messageObserver
)
this.messageOberserver = ...
之后将其传递到observe
函数中。
observe(this,this.messageOberserver)
您的观察者此时为null。因此,构造的观察者永远不会注册,也永远不会被调用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。