Значения OnCompleteListener становятся равными нулю - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь загрузить вложенную коллекцию в моей базе данных Firebase и сохранить идентификаторы документов в архиве, который называется электронная почта.Кажется, загрузка работает, но все значения обнуляются после завершения onComplete.Я вызываю методы set для установки переменных моего класса, но это, похоже, не работает. Вот изображение моей базы данных. image

package com.example.eventfeed.eventFeed;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.NavigationView;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import com.example.eventfeed.login.ActivityLoginEmail;
import com.example.eventfeed.model.Person;
import com.example.eventfeed.model.Post;
import com.example.eventfeed.profiles.Profile_girl;
import com.example.eventfeed.profiles.Profile_guy;
import com.example.eventfeed.profiles.Profile_guy1;
import com.example.eventfeed.R;
import com.example.eventfeed.signup.RegisterActivity;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.QueryDocumentSnapshot;
import com.google.firebase.firestore.QuerySnapshot;
import com.google.firebase.firestore.Source;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;

import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;

import javax.security.auth.callback.Callback;

public class PeopleGoing extends Activity {

    private DocumentReference mDocRef ;
    private CollectionReference docRefEventGoers ;
    private FirebaseStorage storage = FirebaseStorage.getInstance();
    private StorageReference storageRef = storage.getReference();
    private StorageReference coverPhotos;
    private StorageReference profilePics;
    private ImageView cover_photo;
    private ImageView profile_photo;

    private NavigationView navigationView;
    private DrawerLayout drawerLayout;
    private ActionBarDrawerToggle actionBarDrawerToggle;
    private RecyclerView postList;
    private PeopleGoingAdapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;
    private Toolbar mToolbar;
    private  static String email;
    private  static String name;
   private LinkedHashMap<String,Person> people = new LinkedHashMap<String, Person>();
   private ArrayList<String> emails = new ArrayList<String>();

private static String value;

    public void setName(String name) {

        this.name = name;
    }

    public void setEmails(ArrayList<String> emails) {
        this.emails = emails;
    }

    public ArrayList<String> getEmails() {
        return emails;
    }

    public  static String  getName() {
        return name;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public static String getValue() {
        return value;
    }

    public void  setEmail(String email) {
        this.email = email;
    }

    public static String getEmail() {
        return email;
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.people_going_window);
        Bundle b = getIntent().getExtras();
        // or other values
        if(b != null) {
            value = b.getString("event");
        }



       docRefEventGoers = FirebaseFirestore.getInstance().collection("events/"+ value+"/atendees");
        docRefEventGoers.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {

            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if(task.isSuccessful()){
                    for (QueryDocumentSnapshot document : task.getResult()){
                        ArrayList<String> temp = new ArrayList<String>();
                        temp.add(document.getId());
                        setEmails(temp);

                    }


                }

            }
        });

РЕДАКТИРОВАТЬ Данные действительно загружаются временная загрузка

Однако после окончания полного письма электронные письма пусты, даже если setEmails называется пустые письма

РЕДАКТИРОВАТЬ2: Тем не менее, не удалось выяснить проблему, дляЛюбой, у кого была такая же проблема, я обошел ее, поместив всю необходимую функциональность в прослушиватель oncomplete.Определенно не оптимальное решение, но достаточно хорошее, если вы в затруднительном положении.

1 Ответ

0 голосов
/ 10 декабря 2018

Это слишком много для ответного комментария, но вы можете столкнуться с проблемой указателя.Кажется странным, хотя.Давайте рассмотрим следующий потенциал.

Вы имеете дело с указателем.

Вы создаете указатель с жизненным объемом, равным вашему обратному вызову.

Затем вы устанавливаете свойлокальный указатель на эту переменную.Тогда вы выходите за рамки.Визуализируйте это (возможный, но маловероятный сценарий).

-->callbackScope
------>tempArray
-------->addItems
------>emailArray = tempArray memory location
-->outofScope -> tempArray garbage collection = null
aka emailArray was garbage collected = null

-->classScope
------>myEmailArray = tempArray

Чтобы исправить это, вам может понадобиться создать и добавить элементы в массив области действия класса.Дайте этому шанс, дайте мне знать, если это исправит вас, если нет, я удалю этот ответ, просто хотел дать вам что-то попробовать, что не вписывается в комментарий.

Попробуйте это:

 ArrayList<QueryDocumentSnapshot> myResults = task.getResult()
 for (QueryDocumentSnapshot document : myResults){
     getEmails().add(document.getId());
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...