2017-02-14 12 views
0

Firebaseでアプリを作成します。私は解決できない問題があり、ここでそれが話し合われていないことが分かりました。Android - onDataChange()strange behavior

この方法では、一部のデータが既にサーバーにあるかどうかを確認したいと考えています。そうでない場合 - 私はそれを追加したい(追加のコードはうまくいきます、Firebaseデータベースは私が望むように変更されています)。私は、次のような方法をOnDataChangeの使用しています:

public boolean insertNewList(String title) 
{ 
    System.out.println("start: "); 

    final boolean[] result = new boolean[1]; 
    result[0]=false; 

    final String group = title; 

    mRootRef = some reference... 



    mRootRef.addValueEventListener(new ValueEventListener() 
    { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) 
     { 

      System.out.println(0); 

      if (dataSnapshot.child(group).getValue() != null) 
      { 
       System.out.println(group + " is already exist"); 
       System.out.println(1); 

      } 

      //write the data. 
      else 
      { 
       mRootRef=mRootRef.child(group); 
       mRootRef.push().setValue("some data"); 
       System.out.println(2); 
       result[0]=true; 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) 
     { 

     } 
    }); 


    System.out.println(3); 

    return result[0]; 
} 

しかし、何が起こるか本当にこの出力されます:

begin: 
3 (just skip on onDataChange method and return false). 
some print after calling the function 
0 (goes back to function and enter to onDataChange method) 
2 (finally goes where I want it to go) 
0 (for some reason enters twice :( ) 
1 

そして、そのため私は、この関数で間違った結果を受け取ります。 お願いしますか?

+0

「start」を「begin」に置き換えても問題ありません。 – ayelet

答えて

0

だけanywhy一度ショットというあなたは再び呼び出さfirebase、 "addValueEventListener" に、ではないaddListenerForSingleValueEventのように値を追加すると

mRootRef.addListenerForSingleValueEvent(new ValueEventListener() 

mRootRef.addValueEventListener(new ValueEventListener() 

を交換してください。

+0

ありがとう!私はなぜそれが二度入っているのか、私の質問を解決しました。サーバーに何らかの価値が存在するかどうかを尋ねると意味がありません。追加しない場合は、1つではなく2つのアクションとして扱います。あなたのコメントのために – ayelet

0

あなたが私たちに見せた出力は、私には普通のようです。説明してみましょう:

begin: // a) this comes from the System.out.println("begin") 
3  // b) you DECLARE your value event listener and then you run 
     // the System.out.print("3") statement 
0  // c) you just added a listener so firebase calls you, and 
     // your listener fires 
2  // d) this is the first time your listener fires, so you go 
     // into the block called "write the data" 
0  // e) since you just wrote the data, firebase calls you again 
1  // f) this time, since the data has been written, you go into 
     // the block called "is alraedy exist" 

これはfirebaseの正常な動作です。 c)では、リスナーを宣言すると、firebaseは常にあなたに一度戻ってきます。 e)では、データが変更されたためfirebaseが呼び出します。 しかし、b)では、リスナーを宣言しているだけで、まだ実行していないので、この宣言の後のステートメントが実行され、何かが起こる前に "3"が表示されます。

+0

ありがとう。私はこのメソッドが期待どおりではなく、あなたが言及した通りに動作するようになったことを理解しています。私はリスナーが発生したと思って、それから - 関数から値を返します。 – ayelet