Глобальная переменная не равна нулю внутри внутреннего класса, но равна нулю снаружи - PullRequest
0 голосов
/ 13 марта 2019

У меня есть глобальная переменная с именем "myEmail", и я хочу изменить ее значение внутри метода, когда при этом значение переменной изменяется, но только внутри метода (я проверил это с помощью журнала), но при попытке использоватьПеременная снова после изменения значения равна нулю.

Я понятия не имею, каковы причины этой проблемы.Я пытался вызвать метод onCreate, так как думал, что переменная get вызывается до изменения значения, но проблема осталась прежней.

Вот мой код

public class messagesFragment extends Fragment {
    private FirebaseFirestore db = FirebaseFirestore.getInstance();
    private String uid = FirebaseAuth.getInstance().getUid();
    private CollectionReference messageRef = db.collection("messages");
    private View v;
    private RecyclerView recyclerView;
    private messageAdapter mAdapter;
    private String myEmail;
    private FloatingActionButton addmsg;

    public messagesFragment() {
    }
    // Creating the fragment view.
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        v = inflater.inflate(R.layout.messages_fragment, container, false);
        addmsg = (FloatingActionButton) v.findViewById(R.id.sendmsgfab);
        addmsg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getActivity(), createmessageActivity.class);
                startActivity(intent);
            }
        });

        getemail();       // Here the variable myEmail is null.
        setupRecycler();

        return v;
    }

    private void getemail(){
        DocumentReference documentReference = db.collection("users").document(uid);
        documentReference.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
            @Override
            public void onSuccess(final DocumentSnapshot documentSnapshot) {
                myEmail = documentSnapshot.get("email").toString();
              // Here the variable myEmail is not null.
            }
        });
        }

    private void setupRecycler() {
        Query query = messageRef.whereEqualTo("receiver", myEmail);
        FirestoreRecyclerOptions<message> options = new FirestoreRecyclerOptions.Builder<message>()
                .setQuery(query, message.class)
                .build();
        mAdapter = new messageAdapter(options);
        recyclerView = (RecyclerView) v.findViewById(R.id.messagesRecycler);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerView.setAdapter(mAdapter);
    }

    @Override
    public void onStart() {
        super.onStart();
        mAdapter.startListening();
    }

    @Override
    public void onStop() {
        super.onStop();
        mAdapter.stopListening();
    }
}

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Возвращаемое значение вашего метода getemail недействительно!в вашем методе замените String на void.

0 голосов
/ 13 марта 2019

Причина в том, что myEmail назначен внутри метода обратного вызова, который может быть запущен после вызова setupRecycler().Так что вам нужно сделать проверку внутри setupRecycler() в onSuccess

public class messagesFragment extends Fragment {
    private FirebaseFirestore db = FirebaseFirestore.getInstance();
    private String uid = FirebaseAuth.getInstance().getUid();
    private CollectionReference messageRef = db.collection("messages");
    private View v;
    private RecyclerView recyclerView;
    private messageAdapter mAdapter;
    private String myEmail;
    private FloatingActionButton addmsg;

    public messagesFragment() {
    }
    // Creating the fragment view.
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        v = inflater.inflate(R.layout.messages_fragment, container, false);
        addmsg = (FloatingActionButton) v.findViewById(R.id.sendmsgfab);
        addmsg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getActivity(), createmessageActivity.class);
                startActivity(intent);
            }
        });

        getemail();       // Here the variable myEmail is null.

        return v;
    }

    private void getemail(){
        DocumentReference documentReference = db.collection("users").document(uid);
        documentReference.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
            @Override
            public void onSuccess(final DocumentSnapshot documentSnapshot) {
               myEmail = documentSnapshot.get("email").toString();
               runOnUiThread(new Runnable() {
                   public void run() {
                      setupRecycler();
                   }
               });
             }
        });
     }

     private void setupRecycler() {      
          Query query = messageRef.whereEqualTo("receiver", myEmail);
          FirestoreRecyclerOptions<message> options = new FirestoreRecyclerOptions.Builder<message>()
            .setQuery(query, message.class)
            .build();
          mAdapter = new messageAdapter(options);
          recyclerView = (RecyclerView) v.findViewById(R.id.messagesRecycler);
          recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
          recyclerView.setAdapter(mAdapter);
          mAdapter.startListening();
     }

     @Override
     public void onStart() {
         super.onStart();
     }

     @Override
     public void onStop() {
         super.onStop();
        mAdapter.stopListening();
     }
}
...