最佳后台处理/API 调用方法?
Posted
技术标签:
【中文标题】最佳后台处理/API 调用方法?【英文标题】:Best background processing/API call approach? 【发布时间】:2016-07-21 18:55:21 【问题描述】:我提出了两种不同的方法来处理主 UI 线程的 API 调用,我想知道哪一种在性能或资源分配方面更好。这些是特定于 android 的示例,但我也为 ios 设置了类似的设置,因此寻找具有跨平台考虑的答案。
选项 1 - 为请求启动一个新线程,并在 UI 线程的回调中处理响应:
apiTestButton.Click += delegate
progressBar1.Visibility = ViewStates.Visible;
new Thread(new ThreadStart(() =>
string response = Core.BLL.API.GetJsonTest();
RunOnUiThread(() => ApiTestCallback(response));
)).Start();
;
void ApiTestCallback(string response)
progressBar1.Visibility = ViewStates.Invisible;
Toast.MakeText(this.ApplicationContext, "API response: " + response, ToastLength.Long)
.Show();
选项 2 - 利用异步/等待:
apiAsyncTestButton.Click += async (sender, e) =>
progressBar1.Visibility = ViewStates.Visible;
string response = Core.BLL.API.GetJsonTestAsync().Result;
progressBar1.Visibility = ViewStates.Invisible;
Toast.MakeText(this.ApplicationContext, "API response: " + response, ToastLength.Long)
.Show();
;
使用 async/await,代码显然更简洁一些——不需要单独的回调方法。但我想知道这两个选项在性能方面是如何叠加的。我假设 Xamarin 会将 C# 转换/转换为平台原生逻辑(iOS 和 Android),但哪个更容易处理,是否存在性能影响?
【问题讨论】:
如果您使用的库提供了GetJsonTestAsync
,请坚持使用async/await
。不要使用额外的线程来包装对GetJsonTest
的调用。顺便说一句,此指南不是特定于 Xamarin 的。附带说明一下,有 Task.Run
API,您几乎不需要使用低级线程 API。
【参考方案1】:
对于 iOS,答案是不同的。简短的回答是“使用 GCD”。 GCD (Grand Central Dispatch) 是一个简单的库,可以非常干净地管理并发任务。
GCD 代表您管理系统线程池。
Apple 强烈不鼓励您直接使用 pthread,因为它们是一种关键资源并且占用物理内存并且创建/销毁相当昂贵。
(我对 Xamarin 一无所知。我说的是原生 iOS 开发)
【讨论】:
以上是关于最佳后台处理/API 调用方法?的主要内容,如果未能解决你的问题,请参考以下文章
调用 Activity.Recreate() 后维护我的 Activity 后台堆栈的最佳方法是啥?