首页 > 解决方案 > 加载 Firebase 数据时,意图未通过单击传递

问题描述

在我的代码中,当用户单击一个按钮时,它会调用一个函数。在该函数中,数据必须从 firebase 加载。加载成功后,Intent 将使用一些 putExtra 数据传递给另一个活动。

SharedPreferences pref = getApplicationContext().getSharedPreferences("My_pref", MODE_PRIVATE);
        choice = pref.getInt("language", 0);


        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

               if(choice==1)
                {
                    firebase("param1","param2","English");
                }
                if(choice==2)
                {
                    firebase("param1","param2","hindi");
                }

            }
        });

 public void firebase(String files,String titles,String language)
    {

        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference myRef = database.getReference(language);
        DatabaseReference myRef1=myRef.child(titles);
        DatabaseReference myRef2=myRef.child(files);
        myRef1.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                language_title = dataSnapshot.getValue(String.class);
                t=1;

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
        myRef2.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                language_file= dataSnapshot.getValue(String.class);
                f=1;
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

            if(t==1&&f==1) {
                Intent i = new Intent(getApplicationContext(), caf.class);
                i.putExtra("titles", language_title);
                i.putExtra("files", language_file);
                startActivity(i);
            }

    }

但在那种情况下,只有当我点击两次时,意图才会通过。单击时,意图不会通过。哪里有问题?

标签: androidfirebaseandroid-intentfirebase-realtime-database

解决方案


任何需要数据库数据的代码都需要在方法内部onDataChange或从那里调用。

请参阅我的答案以获得更长的解释:getContactsFromFirebase() 方法返回一个空列表

由于您有两种onDataChange方法,因此您需要确保在开始新活动之前都已调用这两种方法。使用一些简单的标志变量来跟踪状态,您可以这样做:

声明两个成员字段:

boolean isTloaded, isFLoaded;

进而

    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference(language);
    DatabaseReference myRef1=myRef.child(titles);
    DatabaseReference myRef2=myRef.child(files);

    isTloaded = false;
    isFloaded = false;

    myRef1.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            language_title = dataSnapshot.getValue(String.class);
            t=1;
            isTloaded = true;
            if (isTloaded && isFloaded) {
                startCafActivity();
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            throw databaseError.toException(); // never ignore errors
        }
    });
    myRef2.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            language_file= dataSnapshot.getValue(String.class);
            f=1;
            isFloaded = true;
            if (isTloaded && isFloaded) {
                startCafActivity();
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            throw databaseError.toException(); // never ignore errors
        }
    });

最后:

private void startCafActivity() {
    if(t==1&&f==1) {
        Intent i = new Intent(getApplicationContext(), caf.class);
        i.putExtra("titles", language_title);
        i.putExtra("files", language_file);
        startActivity(i);
    }
}

它可能更简单,但由于变量名称,我很难弄清楚您的应用程序逻辑。考虑使用更具描述性的命名 than tfcaf让其他人(以及你未来的自己)更容易理解代码的每个部分单独执行的操作。


推荐阅读