您好我使用Firebase Firestore来存储没有服务器的数据。但是,我认为我的Firestore快照侦听器有问题。以下是我使用的代码。
出现问题的快照侦听器
register = FireStore.getUserInfo(firestore, uid).addSnapshotListener(new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(DocumentSnapshot documentSnapshot, FirebaseFirestoreException e) {
Log.d("Snapshot Listener", "Calling");
String source = documentSnapshot != null && documentSnapshot.getMetadata().hasPendingWrites() ? "local" : "server";
if(documentSnapshot != null & documentSnapshot.exists()) {
Log.d("Snapshot Listener", source + " data :" + documentSnapshot.getData());
} else {
Log.d("Snapshot Listener", source + " data : null");
}
currentUser = documentSnapshot.toObject(User.class);
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d("Snapshot Listener", "Point is updated.");
tvBoneNum.setText(String.valueOf(currentUser.getPoint()));
}
});
}
});
User.class - 对不起韩语单词
@Data
public class User {
private String uid; // 유저의 고유 아이디
private String token; // 유저의 파이어베이스 토큰
private String email; // 유저의 이메일 값.
private String photo1; // 유저의 첫번째 사진 NonNull
private String photo2; // 유저의 두번째 사진 NonNull
private String photo3; // 유저의 세번째 사진 Nullable
private String audio; // 유저의 음성 녹음 기록
private int point; // 유저의 현재 포인트 갯수
private String nicname; // 유저의 닉네임
private String gender; // 유저의 성별
private String birth; // 유저의 생년월일
private String location; // 유저의 거주지 주소
private Double lat; // 거주지 주소의 위도
private Double lon; // 거주지 주소의 경도
private String ableTime; // 유저의 산책 가능 시간
private String personality; // 유저의 성격
private String job; // 유저의 직업
private Boolean isPet; // 반려인 여부 true면 반려인 false면 비반려인
private String objective; // 유저의 가입 목적
private String introduce; // 유저의 소개글
private String dogName; // 유저의 강아지 이름
private String dogGender; // 유저의 강아지 성별
private String dogBirth; // 유저의 강아지 탄생일
private String dogKind; // 유저의 강아지 종류
private String dogSize; // 유저의 강아지 크기
private String dogPersonality; // 유저의 강아지 성격
@Getter @Setter private String isSter; // 유저의 강아지 중성화여부
private String social; // 유저의 강아지 사회성
private String poop; // 유저의 강아지 배변훈련
private String obey; // 유저의 강아지 복종정도
private String sports; // 유저의 강아지 스포츠 훈련 정도
private int amount; // 유저의 평점 총점
private int count; // 유저의 평점 갯수
private int average; // 유저의 평점 평균
private int fiveReceived; // 별 5개 받은 횟수
private int fourReceived; // 별 4개 받은 횟수
private int threeReceived; // 별 3개 받은 횟수
private int twoReceived; // 별 2개 받은 횟수
private int oneReceived; // 별 1개 받은 횟수
private int afterFiveReceived; // 매너 별 5개 받은 횟수
private int afterFourReceived; // 매너 별 4개 받은 횟수
private int afterThreeReceived; // 매너 별 3개 받은 횟수
private int afterTwoReceived; // 매너 별 2개 받은 횟수
private int afterOneReceived; // 매너 별 1개 받은 횟수
private int afterAmount; // 매너 후기 총점
private int afterCount; // 매너 갯수
private int afterAverage; // 매너 평균
private int audioAmount; // 음성 총점
private int audioCount; // 음성 평가 갯수
private int audioAverage; // 음성 평점 평균
private boolean isRest; // 휴면 계정 여부
private String joinDate; // 가입 날짜
private Boolean isNoti;
private Boolean didApplyFilter; // 필터를 적용했는지 여부를 표시
private String snsAccount; // 사용자 SNS 계정 종류
private String isMarried; // 기혼 여부
private String trainDegree; // 비반려인이 원하는 훈련 정도
private int birthYear; // 유저의 출생년도
private int remainCard; // 남은 카드 개수
private boolean mannerUnlock; // 매너 잠금 해제 여부
private boolean reviewUnlock; // 리뷰 잠금 해제 여부
private Date mannerUnlockDate; // 매너 잠금 해제 한 날
private Date reviewUnlockDate; // 리뷰 잠금 해제 한 날
}
当User类的值发生更改并将这些值更新到firestore时,快照侦听器应该在onEvent方法的代码下面确认onEvent()方法和进程,但它会使我的应用程序重新启动。其他快照侦听器不会重启应用程序。我无法弄清楚这个问题的原因。我该如何解决?
答案 0 :(得分:1)
您需要在if语句中移动从数据库获取数据的逻辑。您的数据可能是null
。因此,在无效的情况下,不需要执行那些代码行。这就是为什么你重新使用你的应用程序。
register = FireStore.getUserInfo(firestore, uid).addSnapshotListener(new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(DocumentSnapshot documentSnapshot, FirebaseFirestoreException e) {
Log.d("Snapshot Listener", "Calling");
String source = documentSnapshot != null && documentSnapshot.getMetadata().hasPendingWrites() ? "local" : "server";
if(documentSnapshot != null & documentSnapshot.exists()) {
Log.d("Snapshot Listener", source + " data :" + documentSnapshot.getData());
currentUser = documentSnapshot.toObject(User.class);
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d("Snapshot Listener", "Point is updated.");
tvBoneNum.setText(String.valueOf(currentUser.getPoint()));
}
});
} else {
Log.d("Snapshot Listener", source + " data : null");
}
}
});