2016-12-10 13 views
1

こんにちはFirebaseを使用してAndroidアプリケーションを開発していますが、Firebase onchangeメソッドからデータを取得しようとしたときに問題が発生しました。メソッドの内部でのみ使用可能であり、外部ではnullです。 もっと明示するために、いくつかの名前とFirebaseストレージ内の画像へのURL参照を含むデータ配列を持っているので、配列を取得して、データをtextviewsなどに入れます(このすべては、私はそれを行うときに別のfirebaseメソッドを使用する必要がある写真をダウンロードしたいときに私はこのエラーが発生する私はそれが別の内部の非同期メソッドがあるため、エラーが最大スレッド128何かに達したこのように、ここにコードFirebase OnChangeメソッドからデータを取得する

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

      HashMap<String, HashMap> ideasList = (HashMap<String, HashMap>) dataSnapshot.getValue();//getting list 
      idsList = new ArrayList<>(ideasListFire.keySet()); //list of IDs of picture to get from firebase storage        //method to get pictures from firebase storage 
      imagesTab = new HashMap<>(); 
      while (i < idsList.size()) { 
       final long ONE_MEGABYTE = 1024 * 1024; 

       StorageReference storageRef = FirebaseStorage.getInstance().getReferenceFromUrl(ideasListFire.get(idsList.get(i)).get("mainPic").toString()); 
       storageRef.getBytes(ONE_MEGABYTE).addOnSuccessListener(new OnSuccessListener<byte[]>() { 
        @Override 
        public void onSuccess(byte[] bytes) { 
         // Got the download URL for 'users/me/profile.png' 
         Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 
         imagesTab.put(idsList.get(i), bmp); 
         // testim.setImageBitmap(bmp); 
        } 
       }).addOnFailureListener(new OnFailureListener() { 
        @Override 
        public void onFailure(@NonNull Exception exception) { 
         // Handle any errors 
        } 
       }); 

このコードは私を与えるのスレッドの問題 や方法が分離されている他のコードのエラーがidsListがOnDataChangeの方法のうち、nullである原因のIdsリストにnullを与え 私の英語の間違いを手伝ってくれて本当にありがとう=)

答えて

0

あなたはonChanged()メソッドの外にデータを保存する必要があります。これをArrayListに保存し、イテレータを使用してそれらを取得することができます。 onDataChangedメソッドを使用した例を次に示します。

ValueEventListener postListener = new ValueEventListener() { 
@Override 
public void onDataChange(DataSnapshot dataSnapshot) { 

     // Get Post object and use the values to update the UI 
     Iterable<DataSnapshot> returns = dataSnapshot.getChildren(); 

     while(returns.iterator().hasNext()) 
     { 
      Alarm al = returns.iterator().next().getValue(Alarm.class); 
      GlobalData.totalAlarms.add(al); 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     // Getting Post failed, log a message 
     Log.w(TAG, "loadPost:onCancelled", databaseError.toException()); 
     // ... 
    } 
}; 
mDatabase.addValueEventListener(postListener); 
関連する問題