Android Firebase 存储,内部类下载到位图
Android Firebase storage, innerclass download to bitmap
我在使用 Android 列表时遇到了一些问题。我有一个方法可以创建玩家列表,并从 firebase 数据库和存储中加载玩家。
部分玩家有头像,在storage/players/keyname
中存储为生成的key(玩家在数据库中的唯一key就是Firebase存储中的头像名称)。
我遇到的问题是当我尝试创建 OnSuccessListener/player 时。我似乎无法传递数据。
onSuccessListener 的问题:
- 外面的一切都被认为是 "outerclass" 这意味着当我想创建一个播放器时它无法读取 onsuccesslistener 中的数据。
- 里面的一切都不能向监听器外传递任何数据。
- 我无法将其转换为位图
我需要能够使用来自侦听器和地图条目的数据创建 "Player p"。到目前为止,我失败了(不能同时通过)。
//Method to create the list of players. To do: call again after adding new player
public void createPlayerList(){
//The list of players that will be filled
final List listPlayers = new ArrayList<Player>();
//The path where all our players are stored.
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("users")
.child( FirebaseAuth.getInstance().getCurrentUser().getUid() ).child("team").child("players");
//Method that just gets called once
ref.addListenerForSingleValueEvent(new ValueEventListener() {
//dataSnapshot contains all data from the path to our players
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Map<String, Object> players = (Map<String, Object>) dataSnapshot.getValue();
//We return our player data in a map. Loop through each value in the map and create a player object for each player
//And add that player object to our list of players
//Create Storage instance
FirebaseStorage storage = FirebaseStorage.getInstance();
//Create storageReference
final StorageReference storageRef = storage.getReferenceFromUrl("gs://bucket.appspot.com");
// Create a reference to a file from a Google Cloud Storage URI
StorageReference gsReference = storage.getReferenceFromUrl(storageRef + "/players/");
for (Map.Entry<String, Object> entry : players.entrySet()){
Map singlePlayer = (Map) entry.getValue();
//Get unique key
String key = entry.getKey();
storageRef.child(key).getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
//Picasso.with(getActivity()).load(uri).into(R.id.playerProfilePicture);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle any errors
}
});
//standard mage
Bitmap profileBits = BitmapFactory.decodeResource(getResources(), R.drawable.player_icon);
PlayersFragment.this.setProfilePicture(profileBits);
//Create player
Player p = new Player((String) singlePlayer.get("name"), (String) singlePlayer.get("preferredPosition"), profilePicture );
//Add player to list
listPlayers.add(p);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
//Add all results from database to our listview
listViewPlayers = (ListView) fragmentView.findViewById(R.id.players_list);
//Attach adapter to listview, to get a layout for each row
listViewPlayers.setAdapter(new PlayerAdapter(getActivity(), R.layout.row_player_list_item, listPlayers));
//Necessary for handling clicks
listViewPlayers.setItemsCanFocus(true);
}
记住立即添加ListenerForSingleValueEvent returns。您传递给它的侦听器将在一段时间后被调用。就目前而言,您似乎希望它会阻塞,直到结果可用并且 listPlayers 已完全填充。
相反,我建议在您的玩家列表被填充后立即在您的 onDataChange 回调中处理 listViewPlayers。
另请注意,gsReference 似乎并未在任何地方使用。您确定您不是要说 gsReference.child(key).getDownloadUrl()...
在 "players" 文件夹下查找每个在循环中找到的玩家吗?
我在使用 Android 列表时遇到了一些问题。我有一个方法可以创建玩家列表,并从 firebase 数据库和存储中加载玩家。
部分玩家有头像,在storage/players/keyname
中存储为生成的key(玩家在数据库中的唯一key就是Firebase存储中的头像名称)。
我遇到的问题是当我尝试创建 OnSuccessListener/player 时。我似乎无法传递数据。
onSuccessListener 的问题:
- 外面的一切都被认为是 "outerclass" 这意味着当我想创建一个播放器时它无法读取 onsuccesslistener 中的数据。
- 里面的一切都不能向监听器外传递任何数据。
- 我无法将其转换为位图
我需要能够使用来自侦听器和地图条目的数据创建 "Player p"。到目前为止,我失败了(不能同时通过)。
//Method to create the list of players. To do: call again after adding new player
public void createPlayerList(){
//The list of players that will be filled
final List listPlayers = new ArrayList<Player>();
//The path where all our players are stored.
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("users")
.child( FirebaseAuth.getInstance().getCurrentUser().getUid() ).child("team").child("players");
//Method that just gets called once
ref.addListenerForSingleValueEvent(new ValueEventListener() {
//dataSnapshot contains all data from the path to our players
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Map<String, Object> players = (Map<String, Object>) dataSnapshot.getValue();
//We return our player data in a map. Loop through each value in the map and create a player object for each player
//And add that player object to our list of players
//Create Storage instance
FirebaseStorage storage = FirebaseStorage.getInstance();
//Create storageReference
final StorageReference storageRef = storage.getReferenceFromUrl("gs://bucket.appspot.com");
// Create a reference to a file from a Google Cloud Storage URI
StorageReference gsReference = storage.getReferenceFromUrl(storageRef + "/players/");
for (Map.Entry<String, Object> entry : players.entrySet()){
Map singlePlayer = (Map) entry.getValue();
//Get unique key
String key = entry.getKey();
storageRef.child(key).getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
//Picasso.with(getActivity()).load(uri).into(R.id.playerProfilePicture);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle any errors
}
});
//standard mage
Bitmap profileBits = BitmapFactory.decodeResource(getResources(), R.drawable.player_icon);
PlayersFragment.this.setProfilePicture(profileBits);
//Create player
Player p = new Player((String) singlePlayer.get("name"), (String) singlePlayer.get("preferredPosition"), profilePicture );
//Add player to list
listPlayers.add(p);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
//Add all results from database to our listview
listViewPlayers = (ListView) fragmentView.findViewById(R.id.players_list);
//Attach adapter to listview, to get a layout for each row
listViewPlayers.setAdapter(new PlayerAdapter(getActivity(), R.layout.row_player_list_item, listPlayers));
//Necessary for handling clicks
listViewPlayers.setItemsCanFocus(true);
}
记住立即添加ListenerForSingleValueEvent returns。您传递给它的侦听器将在一段时间后被调用。就目前而言,您似乎希望它会阻塞,直到结果可用并且 listPlayers 已完全填充。
相反,我建议在您的玩家列表被填充后立即在您的 onDataChange 回调中处理 listViewPlayers。
另请注意,gsReference 似乎并未在任何地方使用。您确定您不是要说 gsReference.child(key).getDownloadUrl()...
在 "players" 文件夹下查找每个在循环中找到的玩家吗?