我正在开发一个 Unity 项目,其中使用 Firebase 来管理用户数据。我遇到一个反复出现的问题,即异步任务
GetValueAsync()
未完成,并且ContinueWithOnMainThread 中的代码永远不会执行。
下面我详细介绍了上下文和我所尝试的内容:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Firebase;
using Firebase.Auth;
using Firebase.Database;
using Firebase.Extensions;
using System.Threading.Tasks;
public class InitFirebase : MonoBehaviour
{
private void Awake()
{
StartCoroutine(InitializeFirebase());
}
private IEnumerator InitializeFirebase()
{
Firebase.FirebaseApp.LogLevel = Firebase.LogLevel.Debug;
var dependencyCheck = FirebaseApp.CheckAndFixDependenciesAsync();
yield return new WaitUntil(() => dependencyCheck.IsCompleted);
if (dependencyCheck.Result == DependencyStatus.Available)
{
Debug.Log("Firebase initialized.");
ManagePersistLogin(FirebaseAuth.DefaultInstance.CurrentUser);
Debug.Log("Loadind data...");
FirebaseDatabase.DefaultInstance.GetReference("users").GetValueAsync().ContinueWithOnMainThread(task => {
Debug.Log("This never runs");//this never runs
});
}
else
{
Debug.LogError("Could not resolve all Firebase dependencies: " + dependencyCheck.Result.ToString());
}
}
}
我还尝试隔离代码,onButtonClick 在 Firebase 初始化完成后运行此代码。
Debug.Log("Loadind data...");
FirebaseDatabase.DefaultInstance.GetReference("users").GetValueAsync().ContinueWithOnMainThread(task => {
Debug.Log("This never runs");//this never runs
});
我有我的google-services.json,它似乎成功创建了firebase应用程序,我可以使用FirebaseAuth,
FirebaseAuth.DefaultInstance.CurrentUser;
不为空,它也有相应的uid
我有互联网连接,Firebase 规则设置为 .write: true、.read: true。我在 Unity 编辑器中运行游戏
2020.3.20f1
我有最新的 firebase sdk 11.8.1
并且它不会抛出任何类型的错误。就像任务永远无法完成一样。
问题: 无论数据在指定引用处是否可用,ContinueWithOnMainThread 内的回调都不会执行。即使在确认 Firebase 已正确初始化并且不存在依赖性问题(使用 CheckAndFixDependencyAsync() 检查)后,也会发生这种情况。
尝试解决:
检查 Firebase 数据库安全规则以确保正确访问。 确保执行操作时互联网连接处于活动状态。 在调用 GetValueAsync() 之前和之后实现了详细日志,以确认代码到达该点(它永远不会。)
确保您的任务成功完成。也许它默默地引发了异常,并且您的
ContinueWith...
没有被调用。例如,如果您的 task.Result
为空。
你可以尝试这样检查(写在这里,所以可能会有错误):
var task = FirebaseDatabase.DefaultInstance.GetReference("users").GetValueAsync();
await task;
// check `task.Result` here.