从Xamarin Android调用Web API没有返回结果
本文关键字:返回 结果 API Web Xamarin Android 调用 | 更新日期: 2023-09-27 18:13:16
嗨,我已经创建了一个解决方案,其中有3个项目。我的解决方案有一个Windows控制台应用程序,一个Xamarin Android项目和一个可移植类库(PCL)。我在控制台和Android应用程序中都引用了我的PCL。我的PCL有我的模型和ViewModels,我正在从ViewModels调用Web API。下面是一个示例viewModel
public class RoutineViewModel
{
public async Task<IEnumerable<Routine>> GetRoutines()
{
//Lets Get List from Routines Web API
try
{
var client = new HttpClient();
var json = await client.GetStringAsync(BroadCastApiUrls.Routines);
var results = JsonConvert.DeserializeObject<IEnumerable<Routine>>(json);
if (results.Any())
return results;
return null;
}
catch (Exception ex)
{
//Some logging code here
return null;
}
}
}
我是通过这个RoutineViewModel的实例在一个方法调用从一个按钮点击处理程序,这是调用GetRoutines方法的代码
//In the Activity class
readonly RoutineViewModel routineViewModel = new RoutineViewModel();
private async Task<bool> LoadRoutines()
{
try
{
var routines = await routineViewModel.GetRoutines();
if (routines != null)
{
routinesList = routines.ToList();
listView.Adapter = new RoutinesListAdapter(this, routinesList);
}
else
{
var builder = new AlertDialog.Builder(this);
var alert = builder.Create();
alert.SetTitle("No Results!");
// alert.SetIcon(Resource.Drawable)
alert.SetMessage("No Routines From API!");
alert.DismissEvent += alert_DismissEvent;
alert.Show();
return true;
}
}
catch (Exception ex)
{
//Some logging and clean up code
}
return false;
}
这个调用从我的控制台应用程序返回预期的结果,但在我的android模拟器上相同的方法调用没有返回结果。我错过了什么?我快疯了。
编辑从loadRoutines的点击处理程序调用是
bool isLoaded = await LoadRoutines();
你可能会调用Task<T>.Result
或Task.Wait
,这将在控制台应用程序中工作,但在GUI上下文中失败。我在我的博客上更详细地解释了这种行为。
最好的解决方案是用await
代替Result
或Wait
。请注意,这意味着您必须决定在例程加载时UI的外观,然后在加载完成时使用结果更新。