2016-10-13 21 views
0

私のアプリケーションのフィールドでエラーの数をチェックするためにこの関数を作っています。 だから私はこのコードを作りました:FirebaseのonDataChange()で奇妙なHashMapエラーが発生しました

private int getSegnalations(final Location location, DatabaseReference ref, final HashMap<Location,String>mapLocation) { 
    final List<Segnalation> matches = new LinkedList<>(); 
    final String key = mapLocation.get(location); 
    Query query = ref.child("segnalation"); 

    segnalationDialog = createProgressDialog(getActivity(),segnalationDialog,getString(R.string.download)); 
    query.addValueEventListener(new ValueEventListener() 
    { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) 
     { 

      stopProgressDialog(segnalationDialog); 

      for(DataSnapshot dS : dataSnapshot.getChildren()) 
      { 
      Segnalation segnalation = dS.getValue(Segnalation.class); 

      Log.d("keys:",segnalation.getIdPark()+","+mapLocation.get(location)); 

      if(segnalation.getIdPark().equals(key)) 
      { 
       matches.add(segnalation); 
      } 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) 
     { 
      stopProgressDialog(segnalationDialog); 
      showErrorMessage(getActivity(),getString(R.string.dbProblem)); 
     } 
    }); 

    return matches.size(); 
} 

バグがLog.dが私にこのラインを示していることである:

D/keys:: -KTijPwCAd7M7wdZms3S,-KTy7n4WcCx3IUWRsRDX 
D/keys:: -KTjJYQGW8_k6Dpi_z7W,-KTy7n4WcCx3IUWRsRDX 
D/keys:: -KTjKby31PU7PkJWrb5U,-KTy7n4WcCx3IUWRsRDX 
D/keys:: -KTy7n4WcCx3IUWRsRDX,-KTy7n4WcCx3IUWRsRDX 

をしかしバイパスで、私にサイズ0ではなく1

を返す場合

なぜですか?このコードのエラーは何ですか?

+0

Firebaseデータは非同期にロードされます。つまり、 'matches.size()'を返す頃にはまだサーバから何もロードされていません。解決策は、サイズを必要とするコードを 'onDataChange()'に移動することです。 http://stackoverflow.com/questions/31700830/synchronous-blocking-operation/31702957 –

+0

@FrankvanPuffelenを参照してください申し訳ありません、私は2つの子供に2つの異なるクエリを行う必要があります、どのようにすべてのデータを取得するには? – nani

答えて

1

コードの問題は、synchronizationが原因です。 query.addValueEventListener()は、操作を実行するために新しいThreadを開始します。あなたの背景Threadは実行をカウントし、で方法を終了します。これはオフルート0です。このリストは、getSegnalations()メソッドが終了してから長く実行される他のスレッドに取り込まれているためです。

+0

getSegnalations()は別のクエリのonDataChange()で実行されています。これは問題のようですか?どうすれば修正できますか? – nani

+0

最終的には、私はonDataChange()をすべて入れました。ありがとうございます! – nani

関連する問題