据我了解,Firebase实时数据库Transaction.Handler doTransaction方法不在主UI线程中运行(请参阅link)。
在doTransaction中使用这个线程进行一些需要几秒钟才能完成的工作是否可以接受?
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数据库调用的响应能力的唯一影响是什么?
有更好的方法吗?
答案 0 :(得分:2)
您的事务处理程序确实在Firebase Database SDK的运行循环中执行。执行长时间操作将停止所有其他Firebase数据库操作(您不会获得任何事件,写入不会被发送到后端等等),直到您的事务处理程序代码完成并且运行循环可以捕获起来。
这基本上会影响性能,但不会导致任何其他问题。所以在这个意义上,它是可以接受的。"
一般情况下,不建议在事务处理程序中执行长操作。了解事务处理程序在成功之前经常运行多次非常重要。因此,您通常不希望执行任何具有副作用的操作(写入文件或SQL数据库等),因为这些副作用将发生未知次数。
通常情况下,您可以重新编写逻辑,以便在开始事务之前执行耗时的操作,但这取决于用例。