我已经提出了两种不同的方法来处理主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 - 利用async / await:
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),但是它更容易处理并且是否存在性能影响?
答案 0 :(得分:0)
iOS的答案有所不同。简短的回答是"使用GCD。" GCD(Grand Central Dispatch)是一个简单的库,可以非常清晰地管理并发任务。
GCD代表您管理系统线程池。
Apple强烈建议您不要直接使用pthread,因为它们是关键资源并占用物理内存,并且创建/销毁相当昂贵。
(我不知道关于Xamarin的任何事情。我正在谈论本机iOS开发)