您好,我正在开发一个Android应用程序,使用Firebase,我在尝试从Firebase Onchange方法中获取数据时遇到了问题。数据仅在方法内部可用,外部无效。更明确地,我有一系列数据包含一些名称和对firebase存储中图片的URL引用null),当我想下载图片时,我需要使用另一种firebase方法,我会得到此错误,我认为它是因为另一个错误的方法说明了有关最大线程的某些问题,即达到128或类似的东西这是代码
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
}
});
此代码给我线程问题的错误以及分离该方法的其他代码在IDS列表中的null导致IDSLIST不在onDataChange方法中为null非常感谢您的帮助和原谅我的英语错误=)
您需要保存onChanged()方法之外的数据。您可以将其保存在阵列列表中,并使用迭代器将其删除。这是使用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);