2016-12-10 79 views
1

您好我正在开发一个使用Firebase的Android应用程序,我试图从firebase onchange方法中获取数据时遇到问题它一直返回空方法,如果数据只在方法内可用,外部为空。 为了更明确一些,我有一个数据数组,包含一些名称和一个url引用的firebase存储中的图片,所以我得到的数组,我把数据放在textviews等(所有这一切发生在onchange原因外部数据是空),当我想要下载图片时,我需要使用另一个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 
        } 
       }); 

这段代码给我线程问题 和其他代码,其中方法分离的错误给出的ID列表为空导致idsList是空出来的onDataChange方法的非常感谢您的帮助和原谅我的英语错误=)

回答

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);