2016-05-06 17 views
0

このクラスのメソッドを他のクラスから呼び出していますが、いつもfalseを取得します。匿名クラスのonSuccess()メソッドから外部変数を更新する方法Firebase.ValueResultHandler

するonSuccess()

方法私は、このメソッドを呼び出すたび、それは常に、nullを返すには、誰もが、私は正しい結果を得ることができる方法を私に伝えることができ

public class UserAccount { 

Firebase firebase; 

private UserAccount() { 
firebase = new Firebase(firebase_url); 
} 

public static UserAccount getUserAccountInstance(){ 
    return userAccountInstance; 
} 



boolean status = false; 


    public boolean createUserAccount(String username, String password)throws FirebaseException{ 

    if(firebase == null) 
     firebase = new Firebase(firebase_url); 
    firebase.createUser(username+"@firebase.com", password, new Firebase.ValueResultHandler<Map<String, Object>>() { 

     @Override 
     public void onSuccess(Map<String, Object> result) { 
      System.out.println("Successfully created user account with uid:" + result.get("uid")); 
      UserAccount.this.status=true; 

     } 

     @Override 
     public void onError(FirebaseError firebaseError) { 
      System.out.println("Something went wrong!! \n Account cannot be created.. useraccount"); 
      throw new FirebaseException(firebaseError.getMessage()); 

     } 
    }); 

    System.out.println("user"+status);// this produces false 

    return status; 

} 

私も静的キーワードを試してみましたが、それはうまくいきませんでした。

答えて

1

Firebaseはクラウドホスト型のサービスです。ユーザー(この場合)を作成するには、アプリケーションをサーバーに呼び出す必要があります。このサーバーはしばらく時間を費やしてから、ユーザーが作成されます。アプリケーションをブロックするのを防ぐために(悪意のあるApplication Not Responding dialog)、Firebaseクライアントはバックグラウンドで操作を実行し、アプリケーションのメインスレッドを継続します。そのため、出力はすぐにSystem.out.println("user"+status)になります。あなたは恐ろしいユーザーエクスペリエンスを作成することなく、メインスレッドをブロックすることができないので、これは動作しないことができる

​​

あなたはおそらくのようなもので、この関数を呼び出しています。解決策は、あなたのロジックを反転させることです。 「最初にユーザーを作成してからxyzを実行する」と言うのではなく、「xyzを実行するとユーザーを作成する」と言い換えてください。

あなたはにcreateUserAccount方法のxyzコードを移動することによって、次の操作を行います。Setting Singleton property value in Firebase Listener

公共ブールcreateUserAccount(文字列名、文字列のパスワード)FirebaseException {

if(firebase == null) 
    firebase = new Firebase(firebase_url); 
firebase.createUser(username+"@firebase.com", password, new Firebase.ValueResultHandler<Map<String, Object>>() { 

    @Override 
    public void onSuccess(Map<String, Object> result) { 
     Toast.makeText(getActivity(), "The user was created", Toast.LENGTH_LONG).show(); 
     UserAccount.this.status=true; 

    } 

    @Override 
    public void onError(FirebaseError firebaseError) { 
     Toast.makeText(getActivity(), "Failed to create user", Toast.LENGTH_LONG).show(); 
     throw new FirebaseException(firebaseError.getMessage()); 

    } 
}); 
createUserAccount("Abdul Malik", "correcthorsebatterystaple"); 

も参照してくださいここに私の答えをスローします

+0

私はメソッドが 'onSuccess()'メソッドを実行する前に値を返すことを知っていましたが、onSuccessメソッドが実行されるのを待つ方法がわかりませんでした。 createuseraccount()、新しい値を返すように、解決策を教えてくれてありがとう –

関連する問題