Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 等到对象不为null时再执行我的if条件Java_Android_Multithreading_Firebase_Firebase Realtime Database_Firebase Authentication - Fatal编程技术网

Android 等到对象不为null时再执行我的if条件Java

Android 等到对象不为null时再执行我的if条件Java,android,multithreading,firebase,firebase-realtime-database,firebase-authentication,Android,Multithreading,Firebase,Firebase Realtime Database,Firebase Authentication,我有两个方法,都使用相同的对象 Object A; public void methodA() { //Client code talks to server, create data, and instantiate A. A = new A(); } public void methodB() { if(A!=null) { //do something } } 这是我试图实现的简化逻辑,但目前我正在方法a中实例化对象a,我的应用程序正

我有两个方法,都使用相同的对象

Object A;

public void methodA() {
    //Client code talks to server, create data, and instantiate A. 
    A = new A();
}

public void methodB() {
    if(A!=null) {
        //do something
    }
}
这是我试图实现的简化逻辑,但目前我正在方法a中实例化对象a,我的应用程序正在与服务器对话并为该对象创建数据,当我的应用程序执行methodB()对象a时为空

另一个问题是,当我调试我的应用程序时,ObjectA有一个实例,methodB()被正确执行,因为调试是一个较慢的过程,然而,当我运行它时,ObjectA返回为null。我尝试使用notify and wait,但我无法在同步块中设置objectA,因为它返回空值,所以我的应用程序正在崩溃


编辑:添加我的当前代码:

//Firebase Authentication
private FirebaseAuth mAuth;
//Database reference
private DatabaseReference databaseReference;

public void methodA() {
    mAuth.createUserWithEmailAndPassword(
            getUserEmailAddress(), getUserPassword())
            .addOnCompleteListener(ActivityA.this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    Log.d(TAG, "createUserWithEmailAndPassword: onComplete" + task.isSuccessful());
                    if (!task.isSuccessful()) {
                        Toast.makeText(ActivityA.this, "authentication failed",
                                Toast.LENGTH_LONG).show();
                    }
                }
            });
}

public void methodB() {
    if (mAuth.getCurrentUser() != null) {
        databaseReference.child(mAuth.getCurrentUser().getUid()).setValue(userInformation);
    }
}
//Firebase身份验证
私人消防队;
//数据库参考
私有数据库参考数据库参考;
公开无效方法a(){
mAuth.createUserWithEmailAndPassword(
getUserEmailAddress(),getUserPassword())
.addOnCompleteListener(ActivityA.this,新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
Log.d(标记为“createUserWithEmailAndPassword:onComplete”+task.issusful());
如果(!task.issusccessful()){
Toast.makeText(ActivityA.this,“身份验证失败”,
Toast.LENGTH_LONG).show();
}
}
});
}
公共无效方法b(){
if(mAuth.getCurrentUser()!=null){
databaseReference.child(mAuth.getCurrentUser().getUid()).setValue(userInformation);
}
}

mAuth.getCurrentUser()返回null,因为methodB是在服务器创建firebaseUser实例之前执行的

您可以使用
wait()/notify()
来实现这一点,尽管还有更高级的技术:

public synchronised void methodA()
{
    // ...
    a = new A();
    notifyAll();
}

public synchronised void methodB()
{
    while (a == null)
    {
        wait();
    }
    // do something
}

无法理解您关于尝试使用wait¬ify的声明。

您可以使用
wait()/notify()
来实现这一点,尽管还有更高级别的技术:

public synchronised void methodA()
{
    // ...
    a = new A();
    notifyAll();
}

public synchronised void methodB()
{
    while (a == null)
    {
        wait();
    }
    // do something
}

无法理解您关于尝试使用等待和通知的声明。

我不明白为什么这不起作用:

Object A;

public synchronized void methodA() {
    //Client code talks to server, create data, and instantiate A. 
    A = new A();
    this.notify();
};

public synchronized void methodB() {

    while (A==null) {
        this.wait();
    }

    // do something
}

我不明白这为什么行不通:

Object A;

public synchronized void methodA() {
    //Client code talks to server, create data, and instantiate A. 
    A = new A();
    this.notify();
};

public synchronized void methodB() {

    while (A==null) {
        this.wait();
    }

    // do something
}

在了解了您的实际情况后,我相信其他答案中显示的等待/通知方法并不是您案例的最佳解决方案

这里的基本问题似乎是,只有在用户登录/验证后,才需要执行某些操作。这是一个典型的尝试对以异步方式获得的对象执行同步操作的案例。对于这些情况,一般的最佳实践是仅在异步操作得到结果后使用回调执行操作。这里一个很好的解决方案是使用Firebase为身份验证状态的更改提供的回调。从文档中:

mAuthListener = new FirebaseAuth.AuthStateListener() {
    @Override
    public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
        FirebaseUser user = firebaseAuth.getCurrentUser();
        if (user != null) {
            // User is signed in
            Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
        } else {
            // User is signed out
            Log.d(TAG, "onAuthStateChanged:signed_out");
        }
        // ...
    }
};

从这里,您可以确定调用methodB的逻辑(取决于您的具体用例)。

在看到您的实际情况后,我相信其他答案中显示的wait/notify方法并不是您案例的最佳解决方案

这里的基本问题似乎是,只有在用户登录/验证后,才需要执行某些操作。这是一个典型的尝试对以异步方式获得的对象执行同步操作的案例。对于这些情况,一般的最佳实践是仅在异步操作得到结果后使用回调执行操作。这里一个很好的解决方案是使用Firebase为身份验证状态的更改提供的回调。从文档中:

mAuthListener = new FirebaseAuth.AuthStateListener() {
    @Override
    public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
        FirebaseUser user = firebaseAuth.getCurrentUser();
        if (user != null) {
            // User is signed in
            Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
        } else {
            // User is signed out
            Log.d(TAG, "onAuthStateChanged:signed_out");
        }
        // ...
    }
};

从这里,您可以确定调用methodB的逻辑(取决于您的特定用例)。

与异步代码的情况一样,解决方案是将问题从“先获取A,然后执行B”重新定义为“启动A,然后在完成A后执行B”

public void createUserAndSaveToDatabase(){
mAuth.createUserWithEmailAndPassword(getUserEmailAddress(),getUserPassword())
.addOnCompleteListener(ActivityA.this,新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
FirebaseUser=task.getResult().getUser();
数据库参考
.child(用户.getUid())
.setValue(…);
}
}
});
}

与异步代码的常见情况一样,解决方案是将问题从“先获取A,然后执行B”重新定义为“启动A,然后在完成A后执行B”

public void createUserAndSaveToDatabase(){
mAuth.createUserWithEmailAndPassword(getUserEmailAddress(),getUserPassword())
.addOnCompleteListener(ActivityA.this,新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
FirebaseUser=task.getResult().getUser();
数据库参考
.child(用户.getUid())
.setValue(…);
}
}
});
}

是真的如您所示,methodA实例化了,还是在服务器响应时在某个异步方法中实例化了?@JemarJones因此服务器创建了一个用户ID,这就是我的对象。我通过放置a
a=newa()来说明这一点,但这实际上是在服务器端发生的。我认为我们需要看到更详细的内容,以帮助您确定最佳解决方案here@JemarJones添加了我的代码。是真的如您所示,methodA实例化了,还是在服务器响应时在某个异步方法中实例化了?@JemarJones所以服务器创建了一个us