2017-04-12 69 views
1

当我询问很多因素的UI获得冻结。Android的境界findAllAsync()冻结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()方法的另一种方法。

谢谢。

+0

你使用的是什么境界版本? – beeender

+1

您的用户界面会冻结,因为您的映射逻辑发生在用户界面线程上,并针对每个元素进行评估 - 这不是因为Realm速度慢。 Realm的设计不是让每一个元素都在循环中读取;这就是为什么默认情况下,'RealmResults'只是一个懒惰加载的“游标”,它为您提供延迟加载的代理 – EpicPandaForce

+1

,所以解决方法是修改代码的方式为'tvList.add(prepareTV(TVRealm.toTV(tvRealm ),真));'不会在那里,只是使用'TVRealm'直接 – EpicPandaForce

回答

1

如果我没有犯错,而RealmResults正在更新,对于每一个改变你创建的新车型和更新UI新的集合。尝试在另一个线程中调用findAll(),将结果映射到电视,并将完成的电视列表映射到UI线程。

2

据官方Realm文件,findAllAsync作品在后台线程。 https://realm.io/docs/java/latest/#asynchronous-queries

我认为你的数据变化太频繁,所以你试图通知ui太频繁。所以你阻止了用户界面。我想你会在onDataChange方法中通知RecyclerView适配器。

此外,如果你的结果有过多的物品,每次当你的数据变化探索的结果,并添加项目到一个新的列表可能会阻塞UI时间。

+0

中的数据不会改变经常当我创建的片段,它的发生。当我选择抽屉选项时,我有一个抽屉布局,我更改了片段。当抽屉开始关闭应用程序时,片刻会正确加载。 – Sol

+0

当打开/关闭抽屉充气一个片段并将其替换时可能会阻塞ui片刻。避免它的最简单的方法之一,你可以等待抽屉关闭,关闭后可以替换你的碎片。 – savepopulation