【问题标题】:Call to Web API from Xamarin Android not returning results从 Xamarin Android 调用 Web API 未返回结果
【发布时间】:2014-07-17 10:24:52
【问题描述】:

您好,我创建了一个包含 3 个项目的解决方案。我的解决方案有一个 Windows 控制台应用程序、一个 Xamarin Android 项目和一个可移植类库 (PCL)。我在控制台和 Android 应用程序中都引用了我的 PCL。我的 PCL 有我的模型和视图模型,我正在从视图模型调用 Web API。这是一个示例视图模型

 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();

【问题讨论】:

  • 请显示 LoadRoutines 调用
  • 编辑了帖子。最大的问题是 LoadRoutines 中的以下代码部分返回 null 'code' var routines = await routineViewModel.GetRoutines();当控制台应用程序中的相同调用给出结果时的“代码”
  • 您的应用是否有 Internet 权限?您是否尝试过单步执行代码以检查错误、异常等?
  • 是的,我已经通过了代码.. 它只是给出了空结果
  • 嗨 Jason,您所说的 Internet 权限是什么意思?

标签: c# android xamarin.ios xamarin httpclient


【解决方案1】:

您可能在调用堆栈的更上方调用Task&lt;T&gt;.ResultTask.Wait,这将在控制台应用程序上运行,但在 GUI 上下文中失败。我更详细地解释了这种行为on my blog

最好的解决方案是使用await 而不是ResultWait。请注意,这意味着您必须在例程加载时决定 UI 的外观,然后在加载完成时更新结果。

【讨论】:

  • 我斯蒂芬,我按照你的建议做了,但我仍然无法让它工作
  • 你在使用await 一直向上吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-23
  • 1970-01-01
  • 2016-10-23
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多