質問: new MessageDataBean( txtData1, txtData2, imgBitmap, ); messageDataBeanList.add(messageDataBean); show(messageDataBeanList);//表示内容更新処理 } } @Override public void onCancelled(@NonNull DatabaseError databaseError) { } }); ```
回答: こんにちは、はじめまして。コードを拝見させていただきました。 気になった点を挙げさせていただきます。 * forループの中で画像を読み込んでいる箇所にまず問題があるかとおもいます。onSuccessが直後のmessageDataBeanへの代入までに呼ばれる保証はありません(時間がかかる処理のため別プロセスで読み込んでそれが完了するとonSuccessが呼ばれます)。ですのでArrayListに代入されたbitmapがアプリにどうしても必要なのであれば、onSuccessの中で代入と、リストへの要素追加を行ったほうがいいと思います。ただしこの流れではuiへの反映は、同期させる必要があり難しいです。他の手法を検討されることをおすすめします * この時点では画像を読み込まずにURL情報からビューに直接`Glide`などのライブラリで読み込むようにしたほうが良いと思います。 * 頂いたコードから画面への表示方法が推察できませんでした。Androidでは利用するビューにより、実装方法はある程度きまった形を追うことが多いです。codelab(公式)のFriendlyChatはリアルタイムデータベースの処理とStorageからの画像の表示を取り扱っていますので参考になるかもしれません * このケースでは排他制御などは気にしなくても大丈夫です **追記** あまり使ったことはないのですが以下のような手段でListenerを経由せずに、画像のダウンロードの終了を待機することができるようです。getBytesの戻り値のTaskを取得して、Tasks.waitで同期しforループで読み込みが完結するようにするのは、表示周りのコードがいじれないのであれば、ありかもしれません。 Firebase自体が非同期の実装を意図して作られています。Tasksで呼び出しの順序を固定したり、RestAPIで直接操作することで同期処理を実現することは可能だとは思いますが、極力避けてGoogleの提供する実装をなぞることをおすすめします。