【问题标题】:Xamarin Android development: get result from TaskXamarin Android 开发:从任务中获取结果
【发布时间】:2017-04-03 21:50:00
【问题描述】:

我正在使用 Xamarin 开发一个 Android 应用程序。我有一个静态类 NetworkServices,它公开了一些调用 web 服务的方法。 其中之一,查询服务器状态:

public static async Task<SystemInfo> TestConnection(HomeServerInfo hsi)
        {
            HttpClient openRequest = new HttpClient();
            HttpResponseMessage hrm = await openRequest.GetAsync(new System.Uri(hsi.ToString() + "/HomeServices/ServerController"));

            return new SystemInfo(hrm.ToString());
        }

这个方法是从 OnCreate 中调用的:

// Query server status
            Task<SystemInfo> si = NetworkServices.TestConnection(hsi);
            serverStatus.SetText(si.Result.CurrentDateTime, TextView.BufferType.Normal);

但这会冻结应用程序。 为什么错了?查询结果属性不正确? 谢谢

【问题讨论】:

    标签: android xamarin.android task


    【解决方案1】:

    您应该在后台运行您的任务,并通过 UI 线程上的 UI 更新继续它。

    // Query server status
    Task<SystemInfo> si = NetworkServices.TestConnection(hsi);
    si.ContinueWith((result) =>
    {
       using(var h = new Handler(Looper.MainLooper))
       {
          h.Post(()=>serverStatus.SetText(result.CurrentDateTime, TextView.BufferType.Normal));
       }
    }
    
    si.Start();
    

    【讨论】:

    • 谢谢!我有点困惑...... TestConnection 返回一个 Task 对象。当我调用 Result 属性时,我执行的任务是什么?还是 UI 线程一直等到完成?你能解释一下吗?
    • 没错! Task 的 Result 属性的 getter 等价于等待任务完成。而且由于您在主线程(在 onCreate() 内部)上执行它,因此您会阻塞您的应用程序,直到计算出 Result。你是对的 - 访问 Result 属性会在当前上下文中执行任务。 stackoverflow.com/questions/12484112/…
    • 非常感谢您的解释!再见
    猜你喜欢
    • 1970-01-01
    • 2013-12-27
    • 2018-04-15
    • 2012-08-29
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    相关资源
    最近更新 更多