0

このプログラムでは、if条件が満たされている場合、1つの配列要素(flag1 [0])の値を1に設定します。クラス)の場合、値は1に設定されています。しかし、内部クラスの外側にアクセスしようとすると、値は0になります。どのように解決すればよいですか? (同様にgetCount()とsetCount()も、彼らは動作しない、ゲッターとセッターです!)匿名の内部クラス内の変数の保持値

public boolean checkUser(final String user, String program) { 

    database = FirebaseDatabase.getInstance(); 
    final DatabaseReference reference; 

    reference = database.getReference("UserNames").child(program); 

    final int[] flag1 = {0}; 
    reference.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 


      for (DataSnapshot data : dataSnapshot.getChildren()) { 

       String key = data.getKey(); 
       Log.println(Log.ERROR,"msg",key); 

       if (data.getKey().equals(user)) 
       { 
        musername.setError("UserName already Exists1!"); 
        flag1[0] = 1; 
        setCount(1); 
        Log.println(Log.ERROR,"msg", String.valueOf(flag1[0])+String.valueOf(getCount()));//Shows 1 here 

       } 
      } 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

    Log.println(Log.ERROR,"mesg", String.valueOf(flag1[0])+String.valueOf(getCount()));//Shows 0 here 
    if(getCount()==0) 
     return true; 
    return false; 


} 
+0

イベントがトリガーされると、内部クラスのすべてのセクションが実行されます。 –

+0

そうですが、どうすれば解決できますか? @JuanCarlosMendoza –

+0

データは非同期でロードされますが、コードは順番に実行されます。これは、 'return'文が実行されるまでに、データがまだロードされていないことを意味します。これを解決するには、データを必要とするコードを** onDataChange()(ここで示すように)(https://stackoverflow.com/a/33204705)に移動するか、そこから呼び出します[ここ](https://stackoverflow.com/a/40099900))。 –

答えて

0

onDataChange()方法の非同期動作により、あなたは、単にコード行を使用することはできません。

Log.println(Log.ERROR,"mesg", String.valueOf(flag1[0])+String.valueOf(getCount())); 

このメソッドの外は、常にnullになるためです。 Hereさらに詳しい情報

これを解決するには、その値をそのメソッド内でのみ使用し、問題を解決します。それ以外の場合は、非同期の概念を理解し、この回答を参照してください。post

関連する問題