Firebase存储getDownloadUrl()始终返回我选择的最后一个结果

时间:2018-04-12 16:30:52

标签: android firebase firebase-storage

我正在尝试通过获取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();
    }
}

我在这里搜索了很多问题,但处理我的问题并不是一个好的答案。

1 个答案:

答案 0 :(得分:0)

getDownloadUrl()是异步的,在使用表示正在进行的工作的Task对象调用之后立即返回。然后,在下载URL可用之前,您的代码将显示两个Toast

您应该仅在调用成功回调时使用下载URL,因此请将代码移到那里,或者调用使用该URL的方法。

要详细了解Firebase API异步的原因,read this blog