2016-09-29 11 views
1

Firebase Realtime Database Transaction.Handler doTransactionメソッドがメインのUIスレッド(linkを参照)で実行されないことを理解しています。Android 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

私はそうすることができると思う.Transcationはバックグラウンドスレッドなので、UIには関係しないプロセスを行うことができる。 – Jai

答えて

2

あなたのトランザクションハンドラは、Firebase Database SDKの実行ループで実際に実行されます。長い操作を実行すると、トランザクションハンドラのコードが終了して実行ループが追いつかなくなるまで、他のFirebaseデータベース操作がすべて停止します(イベントは発生せず、書き込みはバックエンドに送信されません)。

これは基本的にパフォーマンスに影響しますが、その他の問題は発生しません。そういう意味では、それは「受け入れられる」ものです。

一般的に、トランザクションハンドラ内から長い操作を実行することはお勧めしません。トランザクションハンドラは、成功する前に複数回実行されることが多いことを理解することが重要です。したがって、通常、副作用(ファイルやSQLデータベースなどへの書き込み)を伴う操作を実行したくないのは、それらの副作用が不明確な回数で発生するためです。

多くの場合、トランザクションを開始する前に長期間高価な操作を行うようにロジックを修正することはできますが、ユースケースによって異なります。

+0

ありがとう@Michael。これは、変更が比較的長いタスクである場合であっても、トランザクションでリード・モディファイ・ライト・アトミシティが必要な場合に問題となります。この場合、リード・モディファイ・ライト・アトミック・オペレーションでメインスレッドまたはFirebaseスレッドは重要な機能になります。 – aez

+0

好奇心を掻き立てるために、どのような長い操作を実行する予定ですか?私は一般的に、単純なビジネスロジックタイプのタスクを実装するためにトランザクションを使用する人しか見ていませんでした。 –

+0

良い質問マイケルは、私のアプローチが間違っているかどうかを理解したいからです。私のトランザクションでは、オブジェクトのいくつかのフィールドを読み取ることに基づいて、私はいくつかの複雑な計算を行う必要があります(おそらく数秒の計算時間が必要です)。そのオブジェクトをFirebaseに書き戻します。これは古典的なリード・モディファイ・ライトのトランザクション・アトミック性の要件ですが、私の変更は少し計算時間がかかります。 Btw、Firebaseを愛する。 – aez

関連する問題