teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

メッセージ修正

2020/02/13 15:04

投稿

m_s
m_s

スコア51

title CHANGED
File without changes
body CHANGED
@@ -2,7 +2,8 @@
2
2
  テキストデータはRealtimedatabase、画像はdownloadURLをRealtimedatabaseに保持して、そこから画像の実体をFirebaseStorageから取ってくるようにしております。
3
3
  しかし、実装してみると画像が表示されなくなったりテキストを表示されるべきところに画像が表示されるなど意図しない挙動が起きています。
4
4
  原因として、推測されるのは以下のように画像の取得で用いられるFirebaseStorageとそれ以外の取得に用いられるRealtimedatabaseそれぞれが非同期処理で動いているためかと思われます。
5
- 例えば、realtimeDatabase側の「for(DataSnapshot ds・・・」の4ループ目が画像1だったとして、その画像データの取得(FireStorage側)が完了した時、Realtimedatabaseが7ループ目まで進んでいたとしたら、本来4ループ目のmessageDataBeanに画像データを入れるはずが
5
+ 例えば、realtimeDatabase側の「for(DataSnapshot ds・・・」の4ループ目が画像1だったとして、その画像データの取得(FireStorage側)が完了した時、Realtimedatabaseが7ループ目まで進んでいたとしたら、本来4ループ目のmessageDataBeanに画像データを入れるはずが7ループ目のmessageDataBeanを更新してしまうということです。
6
+ これを防ぐには例えば4ループ目で取得し始めた画像を取得完了後に、4ループ目のList<messageDataBean>の要素(messageDataBean)の画像フィールドにセット、8ループ目で取得しようとした画像を8ループ目のListの要素にセットというように処理を実装する必要があるのですが、その方法を教えていただけないでしょうか。
6
7
 
7
8
  ```Java
8
9
  DatabaseReferense ref = ・・・・;
@@ -53,7 +54,4 @@
53
54
  public void onCancelled(@NonNull DatabaseError databaseError) {
54
55
  }
55
56
  });
56
- ```
57
+ ```
57
-
58
- 画像処理とrealtimedbの処理が連なっておらず非同期の中で画面更新をかけているので、表示内容の整合性が取れていないことにあると考えられる。
59
- ただ、非同期でないと画像が全て取得できるまでフリーズするので、画像が取得できたらその都度整合性を保ったまま(順番を保ったまま)マージして表示する必要がある。