在Android Firebase数据库事务中工作';s背景线程
据我所知,Firebase Realtime Database Transaction.Handler DotTransaction方法不在主UI线程中运行(请参阅) 可以在DotTransaction内部使用此线程来完成一些需要几秒钟才能完成的工作吗在Android Firebase数据库事务中工作';s背景线程,android,multithreading,firebase,firebase-realtime-database,Android,Multithreading,Firebase,Firebase Realtime Database,据我所知,Firebase Realtime Database Transaction.Handler DotTransaction方法不在主UI线程中运行(请参阅) 可以在DotTransaction内部使用此线程来完成一些需要几秒钟才能完成的工作吗 public Transaction.Result doTransaction(MutableData mutableData) { SomeClass p = mutableData.getValue(SomeClass
public Transaction.Result doTransaction(MutableData mutableData) {
SomeClass p = mutableData.getValue(SomeClass.class);
//-- do something here that will take a few seconds
someLongTask(p);
mutableData.setValue(p);
return Transaction.success(mutableData);
}
我所说的“可接受”是指对我的其他Firebase数据库调用的响应性的唯一影响吗
有更好的方法吗?您的事务处理程序确实是在Firebase数据库SDK的运行循环上执行的。执行长时间操作将暂停所有其他Firebase数据库操作(在事务处理程序代码完成且运行循环能够跟上之前,您不会获得任何事件、写入操作不会发送到后端等) 这基本上会影响性能,但不会导致任何其他问题。因此,从这个意义上说,这是“可以接受的” 但一般来说,不建议在事务处理程序中执行长操作。理解事务处理程序在成功之前通常会运行多次是很重要的。因此,您通常不希望执行任何具有副作用(写入文件或SQL数据库等)的操作,因为这些副作用的发生次数未知
通常,您可以修改逻辑,以便在启动事务之前执行耗时较长的操作,但这取决于用例。我认为可以,因为DotTransaction是后台线程,所以我们可以执行与UIThanks@Michael无关的流程。当事务中需要读-修改-写原子性时,这确实会出现问题,即使在修改可能是一个相对较长的任务的情况下——在这种情况下,让读-修改-写原子操作块既不是主线程也不是Firebase线程将是一个有价值的功能。出于好奇,你希望做什么样的长期手术?我通常只看到人们使用事务来实现简单的业务逻辑类型的任务。问得好,Michael,因为我想知道我的方法是否错误。在我的事务中,基于读取对象的几个字段,我必须进行一些复杂的计算(可能需要几秒钟的计算时间),这些计算必须离开主线程,然后根据这些计算,更新对象的一些字段,然后将对象写回Firebase。我相信这是一个经典的读-修改-写事务原子性要求,只是我的修改在计算上有点冗长。顺便说一句,我喜欢Firebase。很高兴你喜欢Firebase!我仍然很好奇你在做什么样的“计算冗长”的操作。:-)在某些情况下,工作队列方法可能更可取(因此,与其在事务中执行工作,不如使用事务“声明”项目,然后开始工作并在完成后更新项目)。或者,您可以读取数据(无事务),进行计算,然后执行事务以更新数据,但如果数据在之前读取后发生更改,则只需中止并重新启动数据。祝你好运两个很好的建议,但是第一个我该怎么做呢?如何声明具有事务的项而不在同一线程内的事务结束时返回该项或中止该项?DotTransaction必须返回Transaction.Result。DotTransaction完成后,似乎不可能保留对该物品的索赔。