C# 无法从xamarin android调用firebase云函数
我正在尝试从我的应用程序调用firebase云函数。我用的是XamarinAndroid。我试着用以下方式来称呼它: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("
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手动停止线程。