如何从Firebase存储下载图像?

时间:2019-09-06 13:29:20

标签: c# image firebase unity3d firebase-storage


我正在尝试使用以下示例从Firebase存储中下载和使用图像:

How to download image from firebase database, and load it into image in unity

跟随调试查找问题:

  

UnityEngine.UnityException:SupportsTextureFormatNative只能从主线程调用。

请提供,如何解决?或者,也许您可​​以提供其他方式来下载和使用图像。
谢谢!

我的代码:

  var firebase = FirebaseStorage.DefaultInstance;
    var storageRef = firebase.GetReferenceFromUrl(_urlPics);

    storageRef.Child(_resourceName).GetBytesAsync(1024*1024).ContinueWith(task =>
    {
        if (task.IsCompleted)
        {
            var texture = new Texture2D(2, 2);
            byte[] fileContent = task.Result;

            texture.LoadImage(fileContent);
            var newRect = new Rect(0.0f, 0.0f, texture.width, texture.height);
            var sprite = Sprite.Create(texture, newRect, Vector2.zero);
            _image.sprite = sprite;
            Debug.Log("FINISH DOWNLOAD");
        }
        else
        {
            print("DOWNLOAD WRONG");
        }
    });

从以下位置抛出错误:

var texture = new Texture2D(2, 2);

1 个答案:

答案 0 :(得分:1)

对此我很快得到了一个很好的说明(感谢Pux0r3):

  

这是次要更新,但是将ContinueWith替换为ContinueWithOnMainThread可以稍微改善这一点。

     

在.NET 4.x运行时中,延续可能经常在后台执行,而此扩展方法会将其推送到主线程

     

.NET 3.x运行时不存在此问题,因为连续性包含在Parse库中,而隐式做到这一点。

有关此方法和其他实现方式的更多信息,请参见 Firebase and Tasks, how to deal with asynchronous logic in Unity


因此,前ContinueWith前“有效”。为了确保并且不必使用例如来实现自定义工作器ConcurrentQueue<Action>(一种在Unity中将回调分配到主线程的常用方法),只需将Firebase.Extensions.TaskExtension中的ContinueWith替换为ContinueWithOnMainThread,就可以了。