Firebase-需要单击两次才能执行正确的功能

时间:2018-03-31 08:43:09

标签: java firebase

Here is my Firebase database file

package com.example.ram.myapp;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;



public class LoginActivity extends AppCompatActivity {

  EditText username,password;
  Button login,signUp;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    performLoginCheck();
}
void performLoginCheck(){
    final int[] t = new int[1];
    t[0] = 0;
    username= findViewById(R.id.uname);
    password= findViewById(R.id.upass);
    signUp=findViewById(R.id.btnsignup);
    signUp.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            startActivity(new Intent(LoginActivity.this, signUpActivity.class));
        }
    });
    login=findViewById(R.id.btnlogin);
    login.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            final String name=username.getText().toString();
            final String pass=password.getText().toString();

            DatabaseReference database= FirebaseDatabase.getInstance().getReference();

            database.child("profile").addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for(DataSnapshot findKeyValue : dataSnapshot.getChildren()) {
                        if (findKeyValue.child("username").getValue() != null && findKeyValue.child("password").getValue() != null) {
                            String nameFound = (String) findKeyValue.child("username").getValue();
                            String passwordFound = (String) findKeyValue.child("password").getValue();
                            System.out.println(nameFound);
                            System.out.println(passwordFound);
                            System.out.println(name);
                            System.out.println(pass);
                            if (name.equals(nameFound)) {
                                System.out.println("true");
                                if (pass.equals(passwordFound)) {
                                    System.out.println("true go");
                                    t[0] =1;
                                    System.out.println(t[0]);
                                }
                            }
                        }
                    }
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
            if(t[0] == 1) {
                Toast text = Toast.makeText(getApplicationContext(),"Hello,world", Toast.LENGTH_LONG);
                text.show();
            }
            else{
                Toast text = Toast.makeText(getApplicationContext(),"Hello,loser", Toast.LENGTH_LONG);
                text.show();
            }
        }
    });
}

}

以上代码适用于我的登录活动,只有满足用户名和密码,我才需要转移到另一个活动。 问题是我需要两次单击登录按钮才能执行该功能。我是这个firebase数据库的新手,我需要有关onDatachange的一些指导以及如何在按钮onclick监听器上使用它。

1 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为您在t[0] = 1方法中设置了onDataChange(),该方法具有异步行为,在术语上意味着,当您检查if(t[0] == 1)时,数据不是&# 39; t尚未在数据库中设置,因此第一次将此语句评估为false。快速解决方法是在int[] t方法中移动数组onDataChange()的声明。还要在方法中使用所有if语句。这样,您就可以使用t[0]的正确值。如果您想使用t[0] outsite方法,我建议您从 post 中查看我的anwser的最后一部分,并查看此 {{ 3}}