首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >全局变量在内部类内不为空,但在外部为空

全局变量在内部类内不为空,但在外部为空
EN

Stack Overflow用户
提问于 2019-03-13 10:42:16
回答 2查看 134关注 0票数 0

我有一个名为"myEmail“的全局变量,当我这样做时,我想在方法中更改它的值,但变量的值只在方法中更改(我使用日志检查过这一点),但当尝试在更改值后再次使用该变量时,它为null。

我不知道这个问题的原因是什么。我尝试在onCreate上调用该方法,因为我认为在更改值之前可能已经调用了变量get,但问题仍然存在。

这是我的代码

代码语言:javascript
复制
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();
    }
}
EN

回答 2

Stack Overflow用户

发布于 2019-03-13 10:49:50

原因是在回调方法中分配了myEmail,该回调方法可能会在调用setupRecycler()后触发。因此,您需要在onSuccess中的setupRecycler()内部进行检查

代码语言:javascript
复制
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();
     }
}
票数 0
EN

Stack Overflow用户

发布于 2019-03-13 16:37:54

getemail方法的返回值为void!请在您的方法中将字符串替换为void。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55133544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档