Проблемы с приложением Android: выход из логического объекта com.google.firebase.firestore.DocumentSnapshot.exists () с пустой ссылкой на объект - PullRequest
0 голосов
/ 30 августа 2018

У меня проблемы с приложением, и мне очень нужна ваша помощь. Я новичок в Android Studio и не знаю, почему мои приложения зависали в SignOut. Я думаю, что это из-за Query SnapShot и этой строки кода:

Я немного говорю по-английски, поэтому мне очень жаль моего плохого английского:)

Вот мой код для HomeFragment

 Query firstQuery =
 firebaseFirestore.collection("Posts").orderBy("timestamp",
 Query.Direction.DESCENDING).limit(3);
         firstQuery.addSnapshotListener(getActivity(), new EventListener<QuerySnapshot>() {
             @Override
             public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {
                 if (!documentSnapshots.isEmpty()) {
                     if (isFirstPageFirstLoad) {
                         lastVisible = documentSnapshots.getDocuments().get(documentSnapshots.size() - 1);
                         blog_list.clear();
                     }

                     for (DocumentChange doc : documentSnapshots.getDocumentChanges()) {

                         if (doc.getType() == DocumentChange.Type.ADDED) {

                             String blogPostId = doc.getDocument().getId();
                             BlogPost blogPost = doc.getDocument().toObject(BlogPost.class).withId(blogPostId);

                             if (isFirstPageFirstLoad) {
                                 blog_list.add(blogPost);
                             } else {
                                 blog_list.add(0, blogPost);
                             }
                             blogRecyclerAdapter.notifyDataSetChanged();
                         }
                     }
                     isFirstPageFirstLoad = false;
                 }
             }
         });
     }
     // Inflate the layout for this fragment
     return view;
 }

 public void loadMorePost(){
     if(firebaseAuth.getCurrentUser() != null) {
         final Query nextQuery = firebaseFirestore.collection("Posts")
                 .orderBy("timestamp", Query.Direction.DESCENDING)
                 .startAfter(lastVisible)
                 .limit(3);

         nextQuery.addSnapshotListener(getActivity(), new EventListener<QuerySnapshot>() {
             @Override
             public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {
                 if (!documentSnapshots.isEmpty()) {
                     lastVisible = documentSnapshots.getDocuments().get(documentSnapshots.size() - 1);
                     for (DocumentChange doc : documentSnapshots.getDocumentChanges()) {
                         if (doc.getType() == DocumentChange.Type.ADDED) {
                             String blogPostId = doc.getDocument().getId();
                             BlogPost blogPost = doc.getDocument().toObject(BlogPost.class).withId(blogPostId);
                             blog_list.add(blogPost);
                             blogRecyclerAdapter.notifyDataSetChanged();
                         }
                     }
                 }
             }
         });

А для MainActivity я использую только это:

private void logOut() {
    mAuth.signOut();
    sendToLogin();
}

BlogRecyclerAdapter.java

    firebaseFirestore.collection("Posts/" + blogPostId + "/Likes").addSnapshotListener( new EventListener<QuerySnapshot>() {
        @Override
        public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {
            if(!documentSnapshots.isEmpty()){
                int count = documentSnapshots.size();
                holder.updateLikesCount(count);

            } else {
                holder.updateLikesCount(0);
            }
        }
    });

И моя фатальная ошибка: в BlogRecyclerAdapter, но если я удаляю весь код в BlogRecyclerAdapter, мои приложения по-прежнему аварийно завершают работу! Я думаю, что реальные проблемы на HomeFragment!

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: learnorburn.lob_application, PID: 15909
                  java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.google.firebase.firestore.QuerySnapshot.isEmpty()' on a null object reference
                      at learnorburn.lob_application.BlogRecyclerAdapter$2.onEvent(BlogRecyclerAdapter.java:117)
                      at learnorburn.lob_application.BlogRecyclerAdapter$2.onEvent(BlogRecyclerAdapter.java:113)
                      at com.google.firebase.firestore.zzi.onEvent(Unknown Source)
                      at com.google.android.gms.internal.zzevc.zza(Unknown Source)
                      at com.google.android.gms.internal.zzevd.run(Unknown Source)
                      at android.os.Handler.handleCallback(Handler.java:751)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:154)
                      at android.app.ActivityThread.main(ActivityThread.java:6776)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1510)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1400)

Заранее благодарю за помощь

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Я нашел решение, но не уверен, что это хорошее решение! В базе данных Firebase я изменяю правило, разрешающее чтение, запись: if request.auth! = Null; если правда; и эта работа. Я думаю, что проблема в том, что когда я выхожу, у меня нет разрешения, поэтому мои приложения зависали. Теперь я хочу знать, есть ли какая-либо безопасность или что-то еще, что может вызвать большие проблемы с этим изменением в Базе данных? Также большое спасибо, чтобы помочь мне. Вы не знаете, как я ценю вашу помощь

0 голосов
/ 30 августа 2018

У вас есть ошибка где-то в вашем запросе или настройке БД. Проверьте документацию EventListener . Там написано:

onEvent будет вызываться с новым значением или с ошибкой, если произошла ошибка произошло. Гарантируется, что одно из значений или ошибок будет ненулевой.

Так что в вашем случае, если QuerySnapshot documentSnapshots равно null, это означает, что FirebaseFirestoreException e не равно null. Однако вы проглотили это исключение. Вместо этого вы должны войти в систему и проверить, что там написано:

Log.e("MyTag", "Firebase exception", e);
...