Realm动态时间范围对象监听:无需定时刷新查询的方案咨询
解决方案:Realm动态时间范围对象监听
Realm的静态查询无法自动更新时间条件(查询构建时的时间戳会被固定),要实现"监听过去10分钟内修改的对象"这一需求,有两种可行方案:
方案1:监听全量数据,回调中动态过滤
无需定时重建查询,通过监听所有Item对象的变化,在每次通知触发时手动筛选符合时间条件的对象。
// 监听所有Item对象的异步查询结果 RealmResults<Item> allItems = realm.where(Item.class).findAllAsync(); allItems.addChangeListener((results, changeSet) -> { // 每次触发通知时,重新计算10分钟前的时间戳 long tenMinutesAgo = System.currentTimeMillis() - 600_000; // 10分钟=600000毫秒 // 过滤并排序符合条件的对象 List<Item> filteredItems = results.stream() .filter(item -> item.getLastModifiedDate().getTime() > tenMinutesAgo) .sorted(Comparator.comparing(Item::getCreationDate).reversed()) .collect(Collectors.toList()); // 此处处理更新后的过滤结果(如刷新UI) });
注意:若Item数据量极大,全量监听可能带来性能开销,需根据实际业务场景权衡。
方案2:优化定时重建查询的逻辑
若希望保留查询层面的过滤(避免全量监听的性能问题),可优化现有定时逻辑,确保旧监听器被正确移除,避免内存泄漏:
private RealmResults<Item> currentResults; private RealmChangeListener<RealmResults<Item>> currentListener; private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); // 初始化定时任务 private void initDynamicQuery() { scheduler.scheduleAtFixedRate(this::refreshQuery, 0, 10, TimeUnit.MINUTES); } private void refreshQuery() { if (!realm.isClosed()) { realm.executeTransactionAsync(realm -> { // 移除旧监听器 if (currentResults != null && currentListener != null) { currentResults.removeChangeListener(currentListener); } // 创建新的动态时间查询 long tenMinutesAgo = System.currentTimeMillis() - 600_000; currentResults = realm.where(Item.class) .greaterThan("lastModifiedDate", new Date(tenMinutesAgo)) .sort("creationDate", Sort.DESCENDING) .findAllAsync(); // 绑定新监听器 currentListener = (results, changeSet) -> { // 处理查询结果更新 }; currentResults.addChangeListener(currentListener); }); } } // 资源释放:页面销毁/退出时调用 private void cleanUp() { scheduler.shutdown(); if (currentResults != null && currentListener != null) { currentResults.removeChangeListener(currentListener); } if (!realm.isClosed()) { realm.close(); } }
内容的提问来源于stack exchange,提问作者J.Doe
相关产品推荐
相关产品推荐

