2016-09-29 3 views
1

Насколько я понимаю, Firebase Realtime Database Transaction.Handler doTransaction не работает в основном потоке пользовательского интерфейса (см. link).Выполнение работы в фоновом потоке базы данных базы данных Firebase

Допустимо ли использовать эту нить внутри 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

Я думаю, да, мы могли бы сделать это, как doTranscation является фоновым потоком, поэтому мы могли бы сделать процесс, который не будет связан с UI – Jai

ответ

2

Ваш обработчик транзакций действительно выполняется в цикле запуска SDK базы данных Firebase. Выполнение длительной операции приведет к остановке всех других операций базы данных Firebase (вы не получите никаких событий, записи не будут отправляться на сервер и т. Д.) До тех пор, пока код обработчика транзакций не завершится, и цикл выполнения не сможет догнать.

Это в основном повлияет на производительность, но не вызовет никаких других проблем. Таким образом, в этом смысле «приемлемо».

В общем случае не рекомендуется выполнять длительные операции из обработчика транзакций. Важно понимать, что обработчик транзакций часто запускается несколько раз, прежде чем он удастся. Таким образом, вы обычно не хотите выполнять какую-либо операцию с побочными эффектами (пишите в файл или базу данных SQL и т. Д.), Так как эти побочные эффекты будут происходить неизвестное количество раз.

Зачастую вы можете переделать свою логику, чтобы выполнить долгую дорогостоящую операцию перед началом транзакции, но это зависит от варианта использования.

+0

Спасибо @Michael. Это создает проблему, когда атомарность чтения-модификации-записи требуется в транзакции, даже в случае, когда модификация может быть относительно длинной задачей, - и в этом случае, если атомная операция чтения-модификации-записи не блокирует ни основные нить или поток Firebase были бы ценной функцией. – aez

+0

Из любопытства, какую долгую операцию вы ожидаете выполнить? Обычно я видел, как люди используют транзакции для реализации простых задач бизнес-логики. –

+0

Хороший вопрос Майкл, потому что я хочу понять, если мой подход ошибочен. В моей транзакции, основанной на чтении нескольких полей объекта, я должен выполнить некоторые сложные вычисления (которые потребуют, вероятно, несколько секунд вычисления), которые должны быть отключены от основного потока, а затем основаны на этих вычислениях, обновить некоторые полей объекта, затем запишите объект обратно в Firebase. Я считаю, что это классическое требование для атомарности транзакции чтения-модификации-записи, за исключением того, что моя модификация немного вычислительно длинна. Btw, любовь Firebase. – aez

Смежные вопросы