Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在除“活动”之外的其他类中使用Firebase需要重复调用_Android_Firebase - Fatal编程技术网

Android 在除“活动”之外的其他类中使用Firebase需要重复调用

Android 在除“活动”之外的其他类中使用Firebase需要重复调用,android,firebase,Android,Firebase,我正在尝试用Android应用程序实现Firebase,并编写了一个简单的登录代码。问题在于,除非在Activity类中使用Firebase代码,否则用户需要按两次login按钮 简而言之,用户尝试登录,但Firebase引用不会立即检索,因此返回错误结果。但是,几秒钟后,您可以看到LogCat返回一个真实结果,如果用户再次单击login按钮,他/她就可以登录了 LogCat 04-30 10:29:25.003: I/WMT(30932): activity 04-30 10:29:25.00

我正在尝试用Android应用程序实现Firebase,并编写了一个简单的登录代码。问题在于,除非在Activity类中使用Firebase代码,否则用户需要按两次login按钮

简而言之,用户尝试登录,但Firebase引用不会立即检索,因此返回错误结果。但是,几秒钟后,您可以看到LogCat返回一个真实结果,如果用户再次单击login按钮,他/她就可以登录了

LogCat

04-30 10:29:25.003: I/WMT(30932): activity
04-30 10:29:25.003: I/WMT(30932): controller
04-30 10:29:25.003: I/kolla(30932): https://REMOVEDURL.firebaseio.com/users/testing
04-30 10:29:25.003: I/kolla(30932): ITS TRUE!
04-30 10:29:25.133: D/dalvikvm(30932): GC_CONCURRENT freed 514K, 14% free 9799K/11271K, paused 6ms+13ms, total 62ms
04-30 10:29:26.274: I/kolla(30932): datachange
04-30 10:29:26.274: I/kolla(30932): https://REMOVEDURL.firebaseio.com/users/testing
04-30 10:29:26.274: I/kolla(30932): hej
04-30 10:29:26.274: I/kolla(30932): Normal password: hej
04-30 10:29:26.274: I/kolla(30932): Password is correct
04-30 10:29:26.274: I/kolla(30932): userExists is true
呼叫活动

public class MainActivity extends Activity {

    private MainController mainController;

    private EditText edtUsername;
    private EditText edtPassword;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mainController = new MainController();

        edtUsername = (EditText)findViewById(R.id.edtUsername);
        edtPassword = (EditText)findViewById(R.id.edtPassword);
    }

    public void btnLoginClick(View view)
    {
        Log.i("WMT", "activity");
        if(mainController.login(edtUsername.getText().toString(), edtP    assword.getText().toString()) != null) {
            Toast toast = Toast.makeText(getApplicationContext(), "Login correct, redirecting...", Toast.LENGTH_LONG);
            toast.show();

            User user = mainController.login(edtUsername.getText().toString(), edtPassword.getText().toString());

            Intent intent = new Intent(this, UserWindowActivity.class);
            intent.putExtra("user", user);
            startActivity(intent);
        } else {
            Toast toast = Toast.makeText(getApplicationContext(), "Invalid username and/or password", Toast.LENGTH_SHORT);
            toast.show();
        }
    }
}
控制器

public final class MainController {

    // This controller handles main activity

    private FirebaseDba dba;

    public MainController() {
        dba = new FirebaseDba();
    }

    public User login(String username, String password) {
        Log.i("WMT", "controller");
        return dba.login(username, password);
    }

}
数据库访问类

public class FirebaseDba {

    private final String FIREBASE_URL = //Removed for safety purposes;

    private Firebase fb;

//  String savedPassword;
    boolean userExists;

    public FirebaseDba() {
        fb = new Firebase(FIREBASE_URL);
    }

    private Firebase getFirebaseConnection() {
        return fb;
    }

    public User login(final String username, final String password) {
        final Firebase dbaa = new Firebase(fb.toString() + "/users/" + username);
        Log.i("kolla", dbaa.toString());
        dbaa.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snap) {
                Log.i("kolla" ,"datachange");
                Log.i("kolla", dbaa.toString());
                Object value = snap.getValue();
                if (value != null) {
                    String dbPassword = snap.child("password").getValue().toString();
                    Log.i("kolla", dbPassword);
                    Log.i("kolla", "Normal password: " + password);
                    if (password.equals(dbPassword)) {
                        Log.i("kolla", "Password is correct");
                        changeToTrue();
                        if(userExists) Log.i("kolla", "userExists is true");

                    }
                }
                else {
                    userExists = false;
                }
            }
            @Override
            public void onCancelled(FirebaseError arg0) {
                // TODO Auto-generated method stub

            }
        });

        Log.i("kolla", "ITS TRUE!");
        if (userExists == true) {
            Log.i("kolla", "userExists equals true");
            return new User(username, password);
        }

        //return new User(username, password);
        return null;
    }

    public void changeToTrue() {
        userExists = true;
    }
}

编辑:没有人有这个问题吗?每个人都在他们的活动中运行他们的DB访问吗?因为这听起来像是坏习惯,我想用一个单独的类来解决这个问题。所有帮助都得到了赞赏。

Firebase事件不会像代码预期的那样同步触发。当从服务器获取数据时,它们会触发。相反,您可以将回调传递给FirebaseDba.login方法,当调用结果可用时调用该方法。您的登录呼叫不应返回用户,因为您还不能保证您拥有数据

<>你也可以考虑简单的登录客户机()来处理Auth.或者,如果没有,您至少可以查看它用于实现所需结果的代码: