境界的长期背景实例

时间:2017-03-19 13:41:21

标签: android realm

我已经阅读了关于在后台非Looper线程上保留长期Realm个实例的警告。我也看到了快速打开和关闭Realm个实例并不是最好的建议。鉴于这些限制(如果其中任何一个无效,请告诉我),我试图找出使用带有websockets的Realm的最佳方法,其中websocket事件包含需要访问Realm的信息。

特别是,这些选项之间的正确方法是什么(或完全不同的东西?):

  • 打开并关闭每个活动的Realm
  • 在线程开始时打开Realm,定期(每30秒左右)开始并在线程上提交事务以使Realm更新。
  • 为处理websocket消息的线程分配Looper。在线程上创建一次Realm实例,并在线程的生命周期内保持打开状态,使用Looper使其保持最新。

其他值得注意的事情:

  • 客户端已经在UI线程上打开了Realm。所以,据我所知,这意味着后台线程至少不需要为模式验证付出代价。
  • 没有办法预测websocket事件的频率。在典型情况下,每秒可能不超过一个或两个事件。但是,如果在更改一堆对象的服务器上发生大型操作,则客户端可能会相当快速地接收数百或数千个websocket事件。

1 个答案:

答案 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)。