Firebase Android Codelab 에서 제공하는 튜토리얼을 한국어로 정리/요약 한 것.
메시지 읽기 채팅 메시지를 포함하고 있는 Codelab 샘플 앱에 포함되 있는 initial_messages.json 파일을 파이어베이스 데이터베이스로 가져와온다.
메시지 가져오기
파이어베이스 콘솔에서 Database를 실행해 Realtime Database로 들어간다.
마우스 오른쪽 클릭으로 Import JSON을 실행한다.
{:width=”500”}
initial_messages.json 파일을 선택한다.
{:width=”500”}
메시지는 아래 같은 구조를 가지고 있다.
{:width=”500”}
실시간 데이터베이스와 스토리지 의존성 추가 앱 프로젝트의 모듈 build.gradle 에 다음 의존성을 추가
1 2 implementation 'com.google.firebase:firebase-database:15.0.0' implementation 'com.google.firebase:firebase-storage:15.0.0'
메시지 동기화 파이어베이스 데이터베이스를 초기화 하고 데이터의 변경을 감지하는 핸들에 리스너를 추가해 준면 리사이클러 뷰에 메시지가 표시된다.
MainActivity.java 에 선언를 한다.
1 2 3 private DatabaseReference mFirebaseDatabaseReference;private FirebaseRecyclerAdapter<FriendlyMessage, MessageViewHolder> mFirebaseAdapter;
MainActivity.java 의 onCreate() 에서 mProgressBar.setVisibility(ProgressBar.INVISIBLE);
를 아래 코드로 대체한다. 이 코드는 초기 있는 메시지를 추가하고 파이어베이스 데이터베이스에서 새 메시지를 대기한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 mFirebaseDatabaseReference = FirebaseDatabase.getInstance().getReference(); SnapshotParser<FriendlyMessage> parser = new SnapshotParser <FriendlyMessage>() { @Override public FriendlyMessage parseSnapshot (DataSnapshot dataSnapshot) { FriendlyMessage friendlyMessage = dataSnapshot.getValue(FriendlyMessage.class); if (friendlyMessage != null ) { friendlyMessage.setId(dataSnapshot.getKey()); } return friendlyMessage; } }; DatabaseReference messagesRef = mFirebaseDatabaseReference.child(MESSAGES_CHILD); FirebaseRecyclerOptions<FriendlyMessage> options = new FirebaseRecyclerOptions .Builder<FriendlyMessage>() .setQuery(messagesRef, parser) .build(); mFirebaseAdapter = new FirebaseRecyclerAdapter <FriendlyMessage, MessageViewHolder>(options) { @Override public MessageViewHolder onCreateViewHolder (ViewGroup viewGroup, int i) { LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext()); return new MessageViewHolder (inflater.inflate(R.layout.item_message, viewGroup, false )); } @Override protected void onBindViewHolder (final MessageViewHolder viewHolder, int position, FriendlyMessage friendlyMessage) { mProgressBar.setVisibility(ProgressBar.INVISIBLE); if (friendlyMessage.getText() != null ) { viewHolder.messageTextView.setText(friendlyMessage.getText()); viewHolder.messageTextView.setVisibility(TextView.VISIBLE); viewHolder.messageImageView.setVisibility(ImageView.GONE); } else { String imageUrl = friendlyMessage.getImageUrl(); if (imageUrl.startsWith("gs://" )) { StorageReference storageReference = FirebaseStorage.getInstance() .getReferenceFromUrl(imageUrl); storageReference.getDownloadUrl().addOnCompleteListener( new OnCompleteListener <Uri>() { @Override public void onComplete (@NonNull Task<Uri> task) { if (task.isSuccessful()) { String downloadUrl = task.getResult().toString(); Glide.with(viewHolder.messageImageView.getContext()) .load(downloadUrl) .into(viewHolder.messageImageView); } else { Log.w(TAG, "Getting download url was not successful." , task.getException()); } } }); } else { Glide.with(viewHolder.messageImageView.getContext()) .load(friendlyMessage.getImageUrl()) .into(viewHolder.messageImageView); } viewHolder.messageImageView.setVisibility(ImageView.VISIBLE); viewHolder.messageTextView.setVisibility(TextView.GONE); } viewHolder.messengerTextView.setText(friendlyMessage.getName()); if (friendlyMessage.getPhotoUrl() == null ) { viewHolder.messengerImageView.setImageDrawable(ContextCompat.getDrawable(MainActivity.this , R.drawable.ic_account_circle_black_36dp)); } else { Glide.with(MainActivity.this ) .load(friendlyMessage.getPhotoUrl()) .into(viewHolder.messengerImageView); } } }; mFirebaseAdapter.registerAdapterDataObserver(new RecyclerView .AdapterDataObserver() { @Override public void onItemRangeInserted (int positionStart, int itemCount) { super .onItemRangeInserted(positionStart, itemCount); int friendlyMessageCount = mFirebaseAdapter.getItemCount(); int lastVisiblePosition = mLinearLayoutManager.findLastCompletelyVisibleItemPosition(); if (lastVisiblePosition == -1 || (positionStart >= (friendlyMessageCount - 1 ) && lastVisiblePosition == (positionStart - 1 ))) { mMessageRecyclerView.scrollToPosition(positionStart); } } }); mMessageRecyclerView.setAdapter(mFirebaseAdapter);
이어서 파이어베이스 데이터베이스에서 갱신하기 위해서 onPause()
와 onResume()
메서드를 갱신한다.
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 @Override public void onPause () { mFirebaseAdapter.stopListening(); super .onPause(); } @Override public void onResume () { super .onResume(); mFirebaseAdapter.startListening(); }
Test message sync 파이어베이스 데이터베이스에 새 메시지를 추가해서 클라이언트와 동기화가 되는지 확인해 보자,
앱을 시작하자,
파이어베이스 콘솔의 데이터베이스에서 새 메시지를 넣자,
{:width=”500”}
앱에서 추가된 메시지가 확인된다.
참조 첫 페이지