C# Xamarin-Android中异步任务的实现

C# Xamarin-Android中异步任务的实现,c#,android,asynchronous,xamarin.android,C#,Android,Asynchronous,Xamarin.android,异步任务似乎是最近最困难的实现之一。实际上,我不想在这里使用多线程,而是使用异步任务。在下面的代码中,我实现了异步任务,将数据从firebase提取到我的应用程序。即使我使用的是异步任务,这也是我在用户界面上体验到的 我有三项活动。应用程序启动到第一个活动中,用户不会遇到任何形式的延迟。当我从第一个活动导航到第二个活动时,导航抽屉布局会滞后几秒钟,然后第二个活动和第三个活动的数据才会出现。之后,当我在3个活动之间导航时,它会平稳地移动。(这意味着它在从一个活动移动到另一个活动之前只滞后一次) 请

异步任务似乎是最近最困难的实现之一。实际上,我不想在这里使用多线程,而是使用异步任务。在下面的代码中,我实现了异步任务,将数据从firebase提取到我的应用程序。即使我使用的是异步任务,这也是我在用户界面上体验到的

我有三项活动。应用程序启动到第一个活动中,用户不会遇到任何形式的延迟。当我从第一个活动导航到第二个活动时,导航抽屉布局会滞后几秒钟,然后第二个活动和第三个活动的数据才会出现。之后,当我在3个活动之间导航时,它会平稳地移动。(这意味着它在从一个活动移动到另一个活动之前只滞后一次)

请注意,当我在OnResume()中注释掉
this.refreshAll()
时,它会平稳移动

我的异步实现得好吗

活动2

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    fab = FindViewById<FloatingActionButton>(Resource.Id.fab);

    fab.Click += delegate
    {
        LayoutInflater HeroInflater = LayoutInflater.From(this);
        View mView = peaceHeroInflater.Inflate(Resource.Layout.HeroDialog, null);
        Android.Support.V7.App.AlertDialog.Builder alertDialogBuilder = new Android.Support.V7.App.AlertDialog.Builder(this);
        alertDialogBuilder.SetView(mView);

        var HeroName = mView.FindViewById<EditText>(Resource.Id.editText1);
        alertDialogBuilder.SetCancelable(false)
            .SetPositiveButton("Save", async delegate
            {
                Hero hero = new Hero();
                hero.Uid = string.Empty;
                hero.Name = HeroName.Text;    
                var firebase = new FirebaseClient(FirebaseUrl);                         
                var item = await firebase.Child("sometable").PostAsync<PeaceHero>(hero);

                await ReloadData();   
            })  
            .SetNegativeButton("Cancel", delegate
            {
                alertDialogBuilder.Dispose();
            });

        Android.Support.V7.App.AlertDialog alertDialogAndroid = alertDialogBuilder.Create();
        alertDialogAndroid.Show();
    };
}

private async void refreshAll()
{
    await ReloadData();
}

private async Task ReloadData()
{
    var firebase = new FirebaseClient(FirebaseUrl);
    var items = await firebase.Child("sometable").OnceAsync<>();

    foreach (var item in items)
    {
        Hero details = new Hero();
        details.Uid = item.Key;
        details.Name = item.Object.Name;
        add_Hero.Add(details);
    }

    rv.SetLayoutManager(new LinearLayoutManager(this));
    rv.SetItemAnimator(new DefaultItemAnimator());                    
}

protected  override void OnResume()
{ 
    base.OnResume();
    this.refreshAll();
}
日志

[Mono] AOT: image 'Mono.Security.dll.so' not found: dlopen failed: library "/data/app-lib/com.companyname.peaceapp.peaceapp-130/libaot-Mono.Security.dll.so" not found
[Mono] AOT: image '/usr/local/lib/mono/aot-cache/arm/Mono.Security.dll.so' not found: dlopen failed: library "/data/app-lib/com.companyname.peaceapp.peaceapp-130/libaot-Mono.Security.dll.so" not found
[Mono] Config attempting to parse: 'Mono.Security.dll.config'.
[Mono] Config attempting to parse: '/usr/local/etc/mono/assemblies/Mono.Security/Mono.Security.config'.
[Mono] Assembly Ref addref System[0x86e311a8] -> Mono.Security[0x8792d7e8]: 2
[Mono] Assembly Ref addref Mono.Security[0x8792d7e8] -> mscorlib[0x73d41ac0]: 68
Loaded assembly: Mono.Security.dll [External]
[Mono] Assembly Ref addref System.Net.Http[0x8649e068] -> System.Core[0x7f2bf708]: 9
[Mono] Assembly Ref addref Mono.Android[0x7f1692f0] -> System[0x86e311a8]: 7
Thread started: <Thread Pool> #4
Thread started: <Thread Pool> #5
[Mono] [0x87aecc90] worker starting
Thread started: <Thread Pool> #6
[Mono] [0x87b045b0] worker starting
Thread started: <Thread Pool> #7
[Mono] [0x87ae1a88] worker starting
[Choreographer] Skipped 80 frames!  The application may be doing too much work on its main thread.
[RecyclerView] No adapter attached; skipping layout
[ProgressBar] updateDrawableBounds: left = 72
[ProgressBar] updateDrawableBounds: top = 0
[ProgressBar] updateDrawableBounds: right = 72
[ProgressBar] updateDrawableBounds: bottom = 0
[Mono] [0x87aecc90] hill climbing, change max number of threads 4
[RecyclerView] No adapter attached; skipping layout
[Mono] Assembly Ref addref Mono.Security[0x8792d7e8] -> System[0x86e311a8]: 8
Thread started: <Thread Pool> #8
Thread started: <Thread Pool> #9
[Mono] [0x851329e8] worker starting
Thread started: <Thread Pool> #10
[Mono] [0x85132de0] worker starting
[Mono] Unloading image System.dll [0x851046d8].
[Mono] Image addref System[0x8548b280] -> System.dll[0x86e30720]: 5
[Mono] Config attempting to parse: 'System.dll.config'.
[Mono] Config attempting to parse: '/usr/local/etc/mono/assemblies/System/System.config'.
[Mono] Unloading image System.dll [0x851046d8].
[Mono] Image addref System[0x8548f438] -> System.dll[0x86e30720]: 6
[Mono] Config attempting to parse: 'System.dll.config'.
[Mono] Config attempting to parse: '/usr/local/etc/mono/assemblies/System/System.config'.
[Mono] Unloading image System.dll [0x851046d8].
[Mono] Image addref System[0x854829d8] -> System.dll[0x86e30720]: 7
[Mono] Config attempting to parse: 'System.dll.config'.
[Mono] Config attempting to parse: '/usr/local/etc/mono/assemblies/System/System.config'.
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_is_assignable_from'.
[Mono] Probing 'java_interop_jnienv_is_assignable_from'.
[Mono] Found as 'java_interop_jnienv_is_assignable_from'.
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_get_byte_array_region'.
[Mono] Probing 'java_interop_jnienv_get_byte_array_region'.
[Mono] Found as 'java_interop_jnienv_get_byte_array_region'.
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_set_byte_array_region'.
[Mono] Probing 'java_interop_jnienv_set_byte_array_region'.
[Mono] Found as 'java_interop_jnienv_set_byte_array_region'.
[Mono] The request to load the assembly System.Core v4.0.0.0 was remapped to v2.0.5.0
[Mono] Unloading image System.Core.dll [0x854f61d0].
[Mono] Image addref System.Core[0x85501bf0] -> System.Core.dll[0x7f2bedb0]: 5
[Mono] Config attempting to parse: 'System.Core.dll.config'.
[Mono] Config attempting to parse: '/usr/local/etc/mono/assemblies/System.Core/System.Core.config'.
[Mono] The request to load the assembly System.Core v4.0.0.0 was remapped to v2.0.5.0
[Mono] Unloading image System.Core.dll [0x855214c8].
[Mono] Image addref System.Core[0x84ff8888] -> System.Core.dll[0x7f2bedb0]: 6
[Mono] Config attempting to parse: 'System.Core.dll.config'.
[Mono] Config attempting to parse: '/usr/local/etc/mono/assemblies/System.Core/System.Core.config'.
[Mono] [0x851329e8] hill climbing, change max number of threads 5
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_get_static_field_id'.
[Mono] Probing 'java_interop_jnienv_get_static_field_id'.
[Mono] Found as 'java_interop_jnienv_get_static_field_id'.
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_get_static_object_field'.
[Mono] Probing 'java_interop_jnienv_get_static_object_field'.
[Mono] Found as 'java_interop_jnienv_get_static_object_field'.
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_call_boolean_method_a'.
[Mono] Probing 'java_interop_jnienv_call_boolean_method_a'.
[Mono] Found as 'java_interop_jnienv_call_boolean_method_a'.
Thread finished: <Thread Pool> #10
[Mono] [0x85132de0] worker finishing
[Mono]AOT:image'Mono.Security.dll.so'未找到:dlopen失败:library”/data/app lib/com.companyname.peaceapp.peaceapp-130/libaot Mono.Security.dll.so“未找到”
[Mono]AOT:image'/usr/local/lib/Mono/AOT cache/arm/Mono.Security.dll.so'未找到:dlopen失败:library”/data/app lib/com.companyname.peaceapp.peaceapp-130/libaot Mono.Security.dll.so
[Mono]配置正在尝试分析:“Mono.Security.dll.Config”。
[Mono]配置正在尝试分析:'/usr/local/etc/Mono/assemblies/Mono.Security/Mono.Security.Config'。
[Mono]组件参考添加参考系统[0x86e311a8]->Mono.Security[0x8792d7e8]:2
[Mono]程序集引用addref Mono.Security[0x8792d7e8]->mscorlib[0x73d41ac0]:68
加载的程序集:Mono.Security.dll[外部]
[Mono]Assembly Ref addref System.Net.Http[0x8649e068]->System.Core[0x7f2bf708]:9
[Mono]组装参考addref Mono.Android[0x7f1692f0]->系统[0x86e311a8]:7
线程已启动:#4
线程已启动:#5
[Mono][0x87aecc90]工人启动
线程已启动:#6
[Mono][0x87b045b0]工人启动
线程已启动:#7
[Mono][0x87ae1a88]工人启动
[编舞]跳过了80帧!应用程序可能在其主线程上做了太多工作。
[RecyclerView]未连接适配器;跳过布局
[ProgressBar]updateDrawableBounds:左=72
[ProgressBar]updateDrawableBounds:top=0
[ProgressBar]updateDrawableBounds:right=72
[ProgressBar]updateDrawableBounds:bottom=0
[Mono][0x87aecc90]爬山,更改最大线程数4
[RecyclerView]未连接适配器;跳过布局
[Mono]组件参考addref Mono.Security[0x8792d7e8]->系统[0x86e311a8]:8
线程已启动:#8
线程已启动:#9
[Mono][0x851329e8]工人启动
线程已启动:#10
[Mono][0x85132de0]工作进程正在启动
[Mono]正在卸载图像系统.dll[0x851046d8]。
[Mono]Image addref System[0x8548b280]->System.dll[0x86e30720]:5
[Mono]配置正在尝试分析:“System.dll.Config”。
[Mono]配置正在尝试分析:'/usr/local/etc/Mono/assemblies/System/System.Config'。
[Mono]正在卸载图像系统.dll[0x851046d8]。
[Mono]Image addref System[0x8548f438]->System.dll[0x86e30720]:6
[Mono]配置正在尝试分析:“System.dll.Config”。
[Mono]配置正在尝试分析:'/usr/local/etc/Mono/assemblies/System/System.Config'。
[Mono]正在卸载图像系统.dll[0x851046d8]。
[Mono]Image addref System[0x854829d8]->System.dll[0x86e30720]:7
[Mono]配置正在尝试分析:“System.dll.Config”。
[Mono]配置正在尝试分析:'/usr/local/etc/Mono/assemblies/System/System.Config'。
[Mono]DllImport在以下位置搜索:''uuu Internal'('(null)')。
[Mono]搜索“java_interop_jnienv_是可分配的”。
[Mono]探测“java_interop_jnienv_是可分配的”。
[Mono]被发现为“java_interop_jnienv_是可分配的”。
[Mono]DllImport在以下位置搜索:''uuu Internal'('(null)')。
[Mono]搜索“java_interop_jnienv_get_byte_array_region”。
[Mono]探测“java_interop_jnienv_get_byte_array_region”。
[Mono]被发现为“java_interop_jnienv_get_byte_array_region”。
[Mono]DllImport在以下位置搜索:''uuu Internal'('(null)')。
[Mono]搜索“java_interop_jnienv_set_byte_array_region”。
[Mono]探测“java_interop_jnienv_set_byte_array_region”。
[Mono]被发现为“java_interop_jnienv_set_byte_array_region”。
[Mono]加载组装系统的请求。Core v4.0.0.0已重新映射到v2.0.5.0
[Mono]正在卸载image System.Core.dll[0x854f61d0]。
[Mono]Image addref System.Core[0x85501bf0]->System.Core.dll[0x7f2bedb0]:5
[Mono]配置正在尝试分析:“System.Core.dll.Config”。
[Mono]配置正在尝试分析:'/usr/local/etc/Mono/assemblies/System.Core/System.Core.Config'。
[Mono]加载组装系统的请求。Core v4.0.0.0已重新映射到v2.0.5.0
[Mono]正在卸载image System.Core.dll[0x855214c8]。
[Mono]Image addref System.Core[0x84FF888]->System.Core.dll[0x7f2bedb0]:6
[Mono]配置正在尝试分析:“System.Core.dll.Config”。
[Mono]配置正在尝试分析:'/usr/local/etc/Mono/assemblies/System.Core/System.Core.Config'。
[Mono][0x851329e8]爬山,更改最大线程数5
[Mono]DllImport在以下位置搜索:''uuu Internal'('(null)')。
[Mono]搜索“java_interop_jnienv_get_static_field_id”。
[Mono]探测“java\u interop\u jnienv\u get\u static\u field\u id”。
[Mono]被发现为“java\u interop\u jnienv\u get\u static\u field\u id”。
[Mono]DllImport在以下位置搜索:''uuu Internal'('(null)')。
[Mono]搜索“java_interop_jnienv_get_static_object_field”。
[Mono]探测“java_interop_jnienv_get_static_object_field”。
[Mono]被发现为“java_interop_jnienv_get_static_object_field”。
[Mono]DllImport在以下位置搜索:''uuu Internal'('(null)')。
[Mono]搜索“java_interop_jnienv_call_boolean_method_a”。
[Mono]探测“java_interop_jnienv_call_boolean_method_a”。
[Mono]被发现为“java_interop_jnienv_call_boolean_method_a”。
螺纹加工:#10
[Mono][0x85132de0]工人整理

可能是
这个.refreshAll()文件
[Mono] AOT: image 'Mono.Security.dll.so' not found: dlopen failed: library "/data/app-lib/com.companyname.peaceapp.peaceapp-130/libaot-Mono.Security.dll.so" not found
[Mono] AOT: image '/usr/local/lib/mono/aot-cache/arm/Mono.Security.dll.so' not found: dlopen failed: library "/data/app-lib/com.companyname.peaceapp.peaceapp-130/libaot-Mono.Security.dll.so" not found
[Mono] Config attempting to parse: 'Mono.Security.dll.config'.
[Mono] Config attempting to parse: '/usr/local/etc/mono/assemblies/Mono.Security/Mono.Security.config'.
[Mono] Assembly Ref addref System[0x86e311a8] -> Mono.Security[0x8792d7e8]: 2
[Mono] Assembly Ref addref Mono.Security[0x8792d7e8] -> mscorlib[0x73d41ac0]: 68
Loaded assembly: Mono.Security.dll [External]
[Mono] Assembly Ref addref System.Net.Http[0x8649e068] -> System.Core[0x7f2bf708]: 9
[Mono] Assembly Ref addref Mono.Android[0x7f1692f0] -> System[0x86e311a8]: 7
Thread started: <Thread Pool> #4
Thread started: <Thread Pool> #5
[Mono] [0x87aecc90] worker starting
Thread started: <Thread Pool> #6
[Mono] [0x87b045b0] worker starting
Thread started: <Thread Pool> #7
[Mono] [0x87ae1a88] worker starting
[Choreographer] Skipped 80 frames!  The application may be doing too much work on its main thread.
[RecyclerView] No adapter attached; skipping layout
[ProgressBar] updateDrawableBounds: left = 72
[ProgressBar] updateDrawableBounds: top = 0
[ProgressBar] updateDrawableBounds: right = 72
[ProgressBar] updateDrawableBounds: bottom = 0
[Mono] [0x87aecc90] hill climbing, change max number of threads 4
[RecyclerView] No adapter attached; skipping layout
[Mono] Assembly Ref addref Mono.Security[0x8792d7e8] -> System[0x86e311a8]: 8
Thread started: <Thread Pool> #8
Thread started: <Thread Pool> #9
[Mono] [0x851329e8] worker starting
Thread started: <Thread Pool> #10
[Mono] [0x85132de0] worker starting
[Mono] Unloading image System.dll [0x851046d8].
[Mono] Image addref System[0x8548b280] -> System.dll[0x86e30720]: 5
[Mono] Config attempting to parse: 'System.dll.config'.
[Mono] Config attempting to parse: '/usr/local/etc/mono/assemblies/System/System.config'.
[Mono] Unloading image System.dll [0x851046d8].
[Mono] Image addref System[0x8548f438] -> System.dll[0x86e30720]: 6
[Mono] Config attempting to parse: 'System.dll.config'.
[Mono] Config attempting to parse: '/usr/local/etc/mono/assemblies/System/System.config'.
[Mono] Unloading image System.dll [0x851046d8].
[Mono] Image addref System[0x854829d8] -> System.dll[0x86e30720]: 7
[Mono] Config attempting to parse: 'System.dll.config'.
[Mono] Config attempting to parse: '/usr/local/etc/mono/assemblies/System/System.config'.
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_is_assignable_from'.
[Mono] Probing 'java_interop_jnienv_is_assignable_from'.
[Mono] Found as 'java_interop_jnienv_is_assignable_from'.
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_get_byte_array_region'.
[Mono] Probing 'java_interop_jnienv_get_byte_array_region'.
[Mono] Found as 'java_interop_jnienv_get_byte_array_region'.
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_set_byte_array_region'.
[Mono] Probing 'java_interop_jnienv_set_byte_array_region'.
[Mono] Found as 'java_interop_jnienv_set_byte_array_region'.
[Mono] The request to load the assembly System.Core v4.0.0.0 was remapped to v2.0.5.0
[Mono] Unloading image System.Core.dll [0x854f61d0].
[Mono] Image addref System.Core[0x85501bf0] -> System.Core.dll[0x7f2bedb0]: 5
[Mono] Config attempting to parse: 'System.Core.dll.config'.
[Mono] Config attempting to parse: '/usr/local/etc/mono/assemblies/System.Core/System.Core.config'.
[Mono] The request to load the assembly System.Core v4.0.0.0 was remapped to v2.0.5.0
[Mono] Unloading image System.Core.dll [0x855214c8].
[Mono] Image addref System.Core[0x84ff8888] -> System.Core.dll[0x7f2bedb0]: 6
[Mono] Config attempting to parse: 'System.Core.dll.config'.
[Mono] Config attempting to parse: '/usr/local/etc/mono/assemblies/System.Core/System.Core.config'.
[Mono] [0x851329e8] hill climbing, change max number of threads 5
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_get_static_field_id'.
[Mono] Probing 'java_interop_jnienv_get_static_field_id'.
[Mono] Found as 'java_interop_jnienv_get_static_field_id'.
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_get_static_object_field'.
[Mono] Probing 'java_interop_jnienv_get_static_object_field'.
[Mono] Found as 'java_interop_jnienv_get_static_object_field'.
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_call_boolean_method_a'.
[Mono] Probing 'java_interop_jnienv_call_boolean_method_a'.
[Mono] Found as 'java_interop_jnienv_call_boolean_method_a'.
Thread finished: <Thread Pool> #10
[Mono] [0x85132de0] worker finishing
protected async override void OnResume()
{ 
    base.OnResume();
    await this.refreshAll();
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;

namespace Android.Basic.Core
{
    public class AsyncTasker : AsyncTask<Java.Lang.Void, Java.Lang.Void, Java.Lang.Void>
    {
        private Action Action { get; }
        public event EventHandler<object> TaskCompleted;
        public void NotifyCompletedTask(object result)
        {
            Xamarin.Essentials.MainThread.BeginInvokeOnMainThread(() =>
            {
                this.TaskCompleted?.Invoke(this, result);
            });
           
        }
        public AsyncTasker(Action action)
        {
            this.Action = action;
        }
        protected override Java.Lang.Void RunInBackground(params Java.Lang.Void[] @params)
        {
            if (this.Action == null)
                return null;
            this.Action();
            return null;
        }
    }
}
var asyncTasker = new AsyncTasker(() =>
            {
                //Do non UI task, Use "MainThread.BeginInvokeOnMainThread" to update UI.
                

                //Notify that task completed
                asyncTasker.NotifyCompletedTask(null);

            });
            asyncTasker.TaskCompleted += delegate
            {
                Xamarin.Essentials.MainThread.BeginInvokeOnMainThread(() =>
                {
                    
                     //Do completed task
                });
            };
            asyncTasker.Execute();