我正在尝试通过获取downloadUrl来播放存储在Firebase存储上的mp3文件。 我使用两个微调器来决定音乐类型和音乐名称,它们与存储时的文件夹名称和文件名相匹配。
但是在第一次选择之后,我得到的Uri是Null。 当我选择第二个时,我得到的Uri是我选择的第一个。 我选择第三个,我得到第二个,依此类推。
以下是我获取Url的代码。
private void prepareMusic() {
btnPlay.setText(getString(R.string.btnplay));
btnPlay.setEnabled(false);
btnStop.setEnabled(false);
mStorageRef.child("music/"+musicType+"/"+musicName).getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
uriTest = uri.toString();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
//uriTest =" ";
}
});
//the toast here is the correct type and name I choose
Toast.makeText(this,"Now musicType is: " + musicType + " musicName is:" + musicName, Toast.LENGTH_SHORT).show();
//the Uri here is always last one I choose and null at beginning
Toast.makeText(this,"uri is: " + uriTest, Toast.LENGTH_LONG).show();
try{
mper.reset();
mper.setDataSource(uriTest);
mper.prepareAsync();
}catch (Exception e){
tos.setText(getString(R.string.setTrackError) + e.toString());
tos.show();
}
}
我在这里搜索了很多问题,但处理我的问题并不是一个好的答案。
答案 0 :(得分:0)
getDownloadUrl()
是异步的,在使用表示正在进行的工作的Task对象调用之后立即返回。然后,在下载URL可用之前,您的代码将显示两个Toast 。
您应该仅在调用成功回调时使用下载URL,因此请将代码移到那里,或者调用使用该URL的方法。
要详细了解Firebase API异步的原因,read this blog。