Android Firestore使应用重启

时间:2018-01-12 06:47:10

标签: android firebase google-cloud-firestore

您好我使用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()方法和进程,但它会使我的应用程序重新启动。其他快照侦听器不会重启应用程序。我无法弄清楚这个问题的原因。我该如何解决?

1 个答案:

答案 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");
        }
    }
});