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