【问题标题】:Realm out on sync (TimerTask and UI Thread)同步领域(TimerTask 和 UI 线程)
【发布时间】:2017-01-11 08:30:27
【问题描述】:

您好,我在我的 android 应用程序上运行了一项服务。 在该服务中,我有一个TimerTask,我在同步保存在主 UI 线程上的数据时遇到问题,TimerTask 每 5 秒运行一次。

例子

UI 线程 - 100 条记录

TimerTask 线程 - 0 条记录

每次TimeTask 时,我都会关闭该线程上的 Realm 实例,试图在下一次执行时获取更新的实例。

我似乎关闭选项不会暂时从缓存中删除实例,所以下次我做Realm.getInstance() 时它提供的和以前一样。

关于在运行TimerTask 时如何让两个线程具有相同数据的任何想法?

【问题讨论】:

  • Realm,默认情况下提供跨多个线程的同步数据,只要你不复制结果,添加一个 changeListener 并使用 LIVE 数据。只要两个线程都使用相同的 Realm 数据库文件,您就不必再次关闭和打开 Realm。分享更多代码以了解更多详情。
  • @VirajTank 我认为 TimerTask 是一个非循环后台线程线程,所以它不会自动同步。
  • @EpicPandaForce - 啊哈,确实错过了那部分,但它仍然应该适用于新查询,问题似乎是别的。
  • @VirajTank 不,他的后台线程不会自动更新,因此缓存不会增加版本。例如,他可以在事务中执行此操作,然后他会看到最新的数据
  • 正如@EpicPandaForce 建议的那样,在 TimeTask 上打开交易对我有用。我没有尝试 changeLister,因为我不会根据数据更新做出反应,而是根据 TimerTask 时间表检查所有情况。感谢大家的帮助

标签: android multithreading realm


【解决方案1】:

在 1.1.1 和 1.2.0 中你可以做一个 hack(它稍后会在 2.0.0 中中断,但是嘿),它会强制新打开的 Realm 成为最新的实例 -

您可以使用包内部的东西通过与 Realm 实例关联的 HandlerController 强制本地线程上的更新

package io.realm;

public class RealmRefresh {
    public static void refreshRealm(Realm realm) {
        Message message = Message.obtain();
        msg.what = HandlerControllerConstants.LOCAL_COMMIT;
        realm.handlerController.handleMessage(msg);
    }
}

然后调用

    realm = Realm.getDefaultInstance();
    RealmRefresh.refreshRealm(mRealm);
    //...
    realm.close();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    相关资源
    最近更新 更多