我已经阅读了关于在后台非Looper线程上保留长期Realm
个实例的警告。我也看到了快速打开和关闭Realm
个实例并不是最好的建议。鉴于这些限制(如果其中任何一个无效,请告诉我),我试图找出使用带有websockets的Realm的最佳方法,其中websocket事件包含需要访问Realm
的信息。
特别是,这些选项之间的正确方法是什么(或完全不同的东西?):
Realm
Realm
,定期(每30秒左右)开始并在线程上提交事务以使Realm更新。Looper
。在线程上创建一次Realm
实例,并在线程的生命周期内保持打开状态,使用Looper
使其保持最新。其他值得注意的事情:
Realm
。所以,据我所知,这意味着后台线程至少不需要为模式验证付出代价。答案 0 :(得分:2)
在每个事件上打开和关闭领域
就我个人而言,根据那些说“他们的王国已经过时”的人来说,我觉得这是可靠的,所以只有在{{1}之后真正打电话给refresh()这才有意义。 }。
在线程开始时打开Realm,定期(每隔30s左右)开始并在线程上提交事务以使Realm更新。
定期更新会导致不必要的交易,或者“不知道变化”#34;时不时地。
此外,您实际上并不需要提交该事务来强制进行更新,因为Realm.getDefaultInstance()
已经将Realm带入了新版本。
beginTransaction()
这本身就足够了 - 但从技术上讲,这是使用realm.beginTransaction();
realm.cancelTransaction();
(不是公共API的一部分)替换的解决方法,如果事务在另一个线程上打开,也会阻塞线程。
为处理websocket消息的线程分配Looper。在线程上创建一次Realm实例,并在线程的生命周期中保持打开状态,使用Looper使其保持最新。
如果您想要始终确保当前线程可靠以及而不阻塞进程中的其他线程,那么这就是去。
所以这两种方式都是:
1。)保留refresh()
仅在事务中对Realm进行查询
2。)根据需要保持newSingleThreadedExecutor()
活着,然后在那里执行web套接字+查询
(就我个人而言,我只使用过HandlerThread
与RxJava + HandlerThread
)。