C# 无法从xamarin android调用firebase云函数

C# 无法从xamarin android调用firebase云函数,c#,android,xamarin,xamarin.android,google-cloud-functions,C#,Android,Xamarin,Xamarin.android,Google Cloud Functions,我正在尝试从我的应用程序调用firebase云函数。我用的是XamarinAndroid。我试着用以下方式来称呼它: public Task<string> AddPoint() { FirebaseFunctions firebaseFunctions = FirebaseFunctions.GetInstance(app)); var func = firebaseFunctions.GetHttpsCallable("

我正在尝试从我的应用程序调用firebase云函数。我用的是XamarinAndroid。我试着用以下方式来称呼它:

public Task<string> AddPoint()
    {
        FirebaseFunctions firebaseFunctions = 
        FirebaseFunctions.GetInstance(app));

        var func = firebaseFunctions.GetHttpsCallable("addPoint").Call(someData);

        return func.Result.Cast<Task<string>>();
    }
但是firebase控制台没有注册调用该函数。返回func.Result.Cast>时抛出错误:Java.Lang.IllegalStateException:任务尚未完成。添加断点后,在Result属性中显示相同的内容。函数属性IsCanceled、Iscompleted和IsSuccessful始终为false。
我遵循了示例代码,但它不包含c示例。

我明白了。首先,需要实现IContinuation和IOnSuccessListener接口:

public class Continuation : Java.Lang.Object, Android.Gms.Tasks.IContinuation
    {
        public Java.Lang.Object Then(Android.Gms.Tasks.Task task)
        {           
            return task.Result;
        }
    }

public class TaskSuccessListener : Java.Lang.Object, IOnSuccessListener
{
    public event EventHandler<OnSuccessEventArgs> Success;

    public void OnSuccess(Java.Lang.Object result)
    {
        Success?.Invoke(this, new OnSuccessEventArgs { Result = result });
    }

    public class OnSuccessEventArgs : EventArgs
    {
        public Java.Lang.Object Result { get; set; }
    }
}
可调用云函数的响应是Java.Lang.Object,可以转换为HashMap。 但是func是一个java任务,它不会阻止.Net任务线程。因此,有必要使用TaskCompletionSource手动暂停线程。 当云函数成功返回时,将调用OnSuccessListener。然后可以设置TaskCompletionSource以继续该任务。 它可以这样使用:

public class FirebaseFunction : AppCompatActivity
    TaskCompletionSource<bool> isRunning;
    TaskSuccessListener.Success += TaskSuccessListener_Success;

    public async Task<string> AddPoint()
    {
        FirebaseFunctions firebaseFunctions = 
        FirebaseFunctions.GetInstance(FirebaseApp));

        var func = firebaseFunctions.GetHttpsCallable("function")
       .Call(someData)
       .ContinueWith(new Continuation())
       .AddOnSuccessListener(this, taskCompletionListener);

        await isRunning.Task;

        HttpsCallableResult httpsResult = (HttpsCallableResult)func.Result;
        HashMap map = httpsResult.Data.JavaCast<HashMap>();

        if (map.ContainsKey("data"))
        {
            response = map.Get("data").ToString();
        }
        return response;
    }

    private void TaskSuccessListener_Success(object sender, TaskSuccessListener.OnSuccessEventArgs e)
    {
        //Alternatively it is possible to get the result directely from e.result         
        //HttpsCallableResult httpsResult = (HttpsCallableResult)e.Result;
        //HashMap map = httpsResult.Data.JavaCast<HashMap>();
        isRunning.SetResult(true);
    }
}

我找到了另一个基于您的解决方案,它对我有效,而且看起来更简单:

        var func =  FirebaseFunctions.Instance.GetHttpsCallable("sayHello").Call();
        await func;
        HttpsCallableResult httpsResult = (HttpsCallableResult)func.Result;

请在返回func.Result.Cast中添加断点;您得到的返回值是多少?云函数可在以下区域使用:U-Cortal1爱荷华美国东部1南卡罗来纳州美国东部4北弗吉尼亚欧洲西部1比利时欧洲西部2伦敦伦敦亚洲东部2香港亚洲东北1东京请检查此线程:请确保这些区域中有。返回func.Result.Cast会引发错误:Java.Lang.IllegalStateException:任务尚未完成。添加断点后,在Result属性中显示相同的内容。函数属性IsCanceled、Iscompleted和IsSuccessful始终为false。我的函数在firebase控制台中设置为us-central1,我相信在代码中未指定时,它是默认设置。顺便说一句,Cast是一种将java对象转换为.net对象的扩展方法。我记得,当时我尝试了您建议的方法,但wait func部分根本不会等待任务完成。相反,它只是立即执行,导致func.Result为null。因此,可以使用TaskCompletionSource手动停止线程。