C# 跳过524帧!应用程序可能在其主线程上做了太多工作

C# 跳过524帧!应用程序可能在其主线程上做了太多工作,c#,android,multithreading,xamarin,C#,Android,Multithreading,Xamarin,我正在使用以下功能为Android应用程序编码: protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.conversation_list_activity); listViewConversationList = FindViewById&

我正在使用以下功能为Android应用程序编码:

protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.conversation_list_activity);
        listViewConversationList = FindViewById<ListView>(Resource.Id.listViewConversationPreview);

        string url = ConstantManager.HOST;
        HttpClient oHttpClient = new HttpClient();


        var oTaskGetAsync = oHttpClient.GetAsync(new Uri(url));
        oTaskGetAsync.ContinueWith((oHttpResponseMessage) =>
        {
            var result = oHttpResponseMessage.Result.Content.ReadAsStringAsync().Result;
            listConversationPreview = Newtonsoft.Json.JsonConvert.DeserializeObject<List<ConversationPreview>>(result);
            ConversationAdapter adapter = new ConversationAdapter(this, listConversationPreview);
            RunOnUiThread(() => listViewConversationList.Adapter = adapter);
            listViewConversationList.ItemClick += listViewConversationList_ItemClick;
        });

    }
protectedoverride void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.conversation\u list\u活动);
listViewConversationList=FindViewById(Resource.Id.listViewConversationPreview);
字符串url=ConstantManager.HOST;
HttpClient oHttpClient=新的HttpClient();
var oTaskGetAsync=oHttpClient.GetAsync(新Uri(url));
oTaskGetAsync.ContinueWith((oHttpResponseMessage)=>
{
var result=oHttpResponseMessage.result.Content.ReadAsStringAsync().result;
listConversationPreview=Newtonsoft.Json.JsonConvert.DeserializeObject(结果);
ConversationAdapter=新建ConversationAdapter(此列表为ConversationPreview);
RunOnUiThread(()=>listViewConversationList.Adapter=Adapter);
listViewConversationList.ItemClick+=listViewConversationList\u ItemClick;
});
}
我成功地运行了它,但是在我为Android支持设计导入了一些Nuget Package之后,现在它抛出了这样一条消息

我/编舞(1962):跳过524帧!申请可能是 在它的主线程上做了太多的工作


您能告诉我我做错了什么吗?

为什么不将整个异步调用封装在它自己的任务中?虽然我会将其拆分为服务,但为了简单起见,我会这样做:

protectedoverride async void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.conversation\u list\u活动);
listViewConversationList=FindViewById(Resource.Id.listViewConversationPreview);
等待任务。运行(异步()=>{
字符串url=ConstantManager.HOST;
HttpClient oHttpClient=新的HttpClient();
string resultString=oHttpClient.GetAsStringAsync(新Uri(url));
listConversationPreview=
Newtonsoft.Json.JsonConvert.DeserializeObject(resultString);
ConversationAdapter=新建ConversationAdapter(此列表为ConversationPreview);
RunOnUiThread(()=>listViewConversationList.Adapter=Adapter);
listViewConversationList.ItemClick+=listViewConversationList\u ItemClick;
}
}
一些旁注: 当在生命周期方法(oncreate等)中运行类似这样的异步方法时,请记住,其他生命周期方法仍将被处理,例如OnResume可能在oncreate完成之前执行-这可能会导致一些非常奇怪的问题,难以调试


在本例中,您可能需要

为什么不将整个异步调用包装在它自己的任务中?虽然我会将其拆分为服务,但为了简单起见,我会这样做:

protectedoverride async void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.conversation\u list\u活动);
listViewConversationList=FindViewById(Resource.Id.listViewConversationPreview);
等待任务。运行(异步()=>{
字符串url=ConstantManager.HOST;
HttpClient oHttpClient=新的HttpClient();
string resultString=oHttpClient.GetAsStringAsync(新Uri(url));
listConversationPreview=
Newtonsoft.Json.JsonConvert.DeserializeObject(resultString);
ConversationAdapter=新建ConversationAdapter(此列表为ConversationPreview);
RunOnUiThread(()=>listViewConversationList.Adapter=Adapter);
listViewConversationList.ItemClick+=listViewConversationList\u ItemClick;
}
}
一些旁注: 当在生命周期方法(oncreate等)中运行类似这样的异步方法时,请记住,其他生命周期方法仍将被处理,例如OnResume可能在oncreate完成之前执行-这可能会导致一些非常奇怪的问题,难以调试


在本例中,您可能需要

您可以通过使用处理程序和操作在Android活动中执行异步操作,这样他们就不会使用UI线程

例如:

protected override void OnResume()
{
    base.OnResume();
    Handler handler = new Handler();
    Action action = async delegate { await UpdateListView(); };
    handler.Post(action);
}

private async Task UpdateListView()
{
    //Get data from internet with async methods here and update the ListView
}

您可以使用Handler和Action在Android活动中执行异步操作,这样它们就不会使用UI线程

例如:

protected override void OnResume()
{
    base.OnResume();
    Handler handler = new Handler();
    Action action = async delegate { await UpdateListView(); };
    handler.Post(action);
}

private async Task UpdateListView()
{
    //Get data from internet with async methods here and update the ListView
}

我为此写了一篇博客,可能有助于解释这些概念:我写了一篇博客,可能有助于解释这些概念: