Android领域findAllAsync()冻结UI

时间:2017-04-12 20:32:51

标签: android realm

当我查询很多元素时,UI会被冻结。

realm.where(TVRealm.class).equalTo("favorite", true).findAllAsync()
                .addChangeListener(new RealmChangeListener<RealmResults<TVRealm>>() {
                    @Override
                    public void onChange(RealmResults<TVRealm> element) {
                        List<TV> tvList = new ArrayList<>();
                        for (TVRealm tvRealm : element) {
                            tvList.add(prepareTV(TVRealm.toTV(tvRealm), true));
                        }
                        listener.onDataChange(tvList);
                    }
                });

我认为findAllAsync()将在其他线程上运行并避免问题但不是。 有谁知道如何避免这个问题?也许没有使用findAllAsync()方法还有另一种方法。

感谢。

3 个答案:

答案 0 :(得分:2)

根据官方Realm文档,findAllAsync在后​​台主题中工作。 https://realm.io/docs/java/latest/#asynchronous-queries

我认为您的数据经常更改,因此您经常尝试通知ui。所以你要阻止你。我猜您正在通过RecyclerView方法通知onDataChange适配器。

此外,如果您的结果列表包含太多项目,那么每次数据更改时,探索结果并将项目添加到新列表可能会阻止ui。

答案 1 :(得分:1)

如果我没有犯错误,当RealmResults正在更新时,对于每个更改,您都可以使用新模型和更新UI创建新集合。尝试在另一个主题中调用findAll(),将结果映射到电视,并将完成的电视列表发布到UI线程。

答案 2 :(得分:0)

为什么不尝试这个

RealmResult<item> res=realm.where(item.class).where("name","sanjay").findAll();

它将一次获取所有数据。