在我的应用程序中,我通常有一个加载器,它从sqlite加载数据,然后将它传递给它附加的活动或片段,从它在absListView的适配器中设置,然后将它呈现给用户
由于领域声明了它的objects shouldn't be shared across threads,如何在不从UI线程进行任何db调用的情况下实现这一点? (这会使应用程序感觉迟钝,因为我点击数量很大)
同样在3 examples - intro,gridView& migration,多次在UI线程中完成数据库操作。 UI线程中的数据库操作是否在Android中严重皱眉?
答案 0 :(得分:4)
你是对的,目前无法在后台线程上加载项目,然后将其解析为UI线程。但是,它在路线图上,请参见此处:https://github.com/realm/realm-java/issues/503
Realm非常快,所以在那之前,对于少量数据,即使你在UI线程上加载数据,也可能不会跳过帧。
答案 1 :(得分:2)
当我第一次在他们的网站上阅读有关领域时,看到他们的基准测试我感到非常兴奋。然而,当我进入限制部分时,我在那里停留了2分钟并且正在思考"跨线程的对象共享预防"。从内部来看,它告诉我去领域,但这种限制阻碍了我。所以最后我决定实现某种包装,允许我在所有线程中共享该对象。
这是事情。 读取和写入磁盘的过程比创建简单对象花费更多时间。这就是我带有包装器创建的重点。
1)我保持允许创建realmObject子类的对象,而不是在创建它的同一个线程上的对象访问规则。
e.g。
XyzsubclassofRealmObject xyzObject = new XyzsubclassofRealmObject();
2)将此对象传递给执行数据库操作的方法
e.g。
insertOrUpdate(xyzObject);
//implementation
insertOrUpdate(XyzsubclassofRealmObject object) //you can make this method generic to accept any object that is subclass of RealmObject
{
Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
XyzsubclassofRealmObject databaseObject = realm.copyToRealmOrUpdate(object);
//notice this copyToRealmOrUpdate method provides by Realm
realm.commitTransaction();
XyzsubclassofRealmObject copyObject = clone(databaseObject);
return copyObject;
}
3)现在还有两点他们提到了
RealmObject的子类只有默认的getter和setter方法,如果想要我们的其他逻辑,则允许使用静态方法。感谢上帝,他们允许静态方法。 :)
它可以实现没有方法的接口。 :(
我正在考虑克隆从copyToRealmOrUpdate返回的databaseObject。由于没有方法的界面允许(即第二点),第一点来帮助我。
public static XyzsubclassofRealmObject clone(XyzsubclassRealmObject databaseObject)
{
XyzsubclassOfRealmObject obj = new XyzsubclassofRealmObject();
obj.setXyz(databaseObject.getXyz());
return obj;
}
我没有直接调用此处所示的克隆方法,而是使用反射方法调用克隆方法,因为我编写了通用包装器来执行数据库操作而不是特定模型。您可以自由选择
那就是它。你完成了。如您所见,我们返回复制的对象而不是数据库对象,您可以在任何线程上自由使用它。 :)
结论:许多博客和帖子都说它性能如此之快,在执行事务时在UI线程上使用它是很好的。但选择取决于你。您事先并不知道在应用程序使用量增加时,数据库中有多少数据进出数据库。如果该事务将有足够的数据使您的UI缓慢,它将会。此外,我们所有开发人员都有练习在工作线程而不是UI线程上执行数据库和网络操作,因此它不会阻止任何UI交互。
读取和写入磁盘的过程需要更多时间,而不是简单 对象创建