协程内部的异步功能在Android上不起作用

时间:2019-03-26 09:00:05

标签: android firebase unity3d firebase-realtime-database c#-4.0

我正在尝试在Unity项目中创建“使用Facebook登录”流程。 我正在使用Facebook SDK和Firebase来验证用户数据并将其存储在在线数据库中。

仅当用户不存在时才需要更新数据库。所以我在用协程

    public void someCodeHere(params){
        StartCoroutine(waitForTask(task, uid, name, email));
}

    IEnumerator waitForTask(Task<DataSnapshot> task, string uid, string name, string email)
    {
        while(!task.IsCompleted)
        {
            Debug.Log("Wait task to coplete");
            yield return new WaitForSeconds(1);
        }
        Debug.Log(task.Result.GetRawJsonValue());
        if(task.Result.GetRawJsonValue() == null || task.Result.GetRawJsonValue() == "")
        {
            HardUpdateUser(uid, name, email);
        }
        else
        {
            SetExistingUser(task);
        }
    }

SetExistingUser可以在编辑器和设备上完美运行, 但是HardUpdateUser(uid,name,email);在设备上无法正常运行,但在统一编辑器中可以完美运行。

下面是函数内的代码:

        var status = reference.Child("users").Child(userId).SetRawJsonValueAsync(json).ContinueWith(task =>
        {

            if (task.IsCanceled)
            {
                Debug.LogError("CreateUpdateUserInDB was canceled.");
                return;
            }
            if (task.IsFaulted)
            {
                Debug.LogError("CreateUpdateUserInDB encountered an error: " + task.Exception);
                return;
            }
            Debug.LogFormat("User CreateUpdateUserInDB successfully: {0} ({1})",
                user.userName, userId);

        });

1 个答案:

答案 0 :(得分:0)

所以。我没有日志,因为我没有足够的时间,我想我很懒。 无论如何,我找到了解决该问题的方法。

我没有提到的事情是,我在另一个协程(当然在另一个库鲁汀内)中启动协程# n1, n2 = cell numbers cellsize = 100.0 x1,x2 = n1%gs, n2%gs y1,y2 = n1//gs, n2//gs dist = sqrt( float(x1-x2)**2 + float(y1-y2)**2) # pythagoras theorem dist *= cellsize 。所以我有很多库鲁尼。他们中的大多数人都在等待来自先前功能等的某些对象。我在while循环中使用了一些计数器。例如

StartCoroutine(waitForTask(task, uid, name, email));

并且等待变量通常是少量协程的一个。 所以我改变了:

  1. 我不再等待对象,而是要完成特殊任务 (例如while(obj == null && wait > 0) { wait--; yield return new WaitForSceonds(1); } wait = 15; //run next coroutine
  2. 我将wait var更改为时间戳。 (例如,我不想等待 用户登录超过15秒)

因此,我的根本问题不在问题中提到的代码中。

找到时间调查Android日志并弄清协程堆积的原因后,我会更新答案。

这是带有时间戳的示例:

task.IsCompleted