在后台线程上使用异步方法的Xamarin.Android会导致屏幕闪烁

时间:2015-02-13 01:29:54

标签: c# android android-asynctask xamarin.android async-await

因此,我尝试为我正在创建的应用创建加载/启动画面。基本上,如果用户未经过身份验证,那么他们就无法访问应用的其他部分。此外,我希望应用程序在加载主要活动之前尝试同步必要的数据库对象。

问题在于,当我调用Authenticate()方法和InitLocalStoreAsync()方法时,屏幕会闪烁(几乎就像重新加载活动,或者像应用程序正在做一些我不明白的事情&#39 ; s)在方法执行时隐藏活动。我希望不会发生这种情况。

我是Android App Dev的新手,甚至是Xamarin的新手。

我使用来自Azure移动服务教程的修改代码进行身份验证等。

我应该以某种方式使用RunOnUiThread执行这些方法吗?如果是这样,我如何与RunOnUiThread一起等待?或者我应该以完全不同的方式这样做?

我很失落。我试图搜索并找到要遵循的教程,但我似乎无法找到答案。这是迄今为止的代码:

protected override async void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);
        SetContentView (Resource.Layout.Activity_Splash);
        // Create your application here

        try{
            CurrentPlatform.Init ();

            // Create the Mobile Service Client instance, using the provided
            // Mobile Service URL and key
            client = new MobileServiceClient (applicationURL, applicationKey);
            statusText = FindViewById<TextView> (Resource.Id.SplashStatusText);

            ThreadPool.QueueUserWorkItem(x => Initialize());

        }catch(Java.Net.MalformedURLException){
            CreateAndShowDialog (new Exception ("There was an error creating the Mobile Service. Verify the URL"), "Error");
        }catch(Exception e) {
            CreateAndShowDialog (e, "Error");
        }
    }

    private async void Initialize()
    {
        RunOnUiThread(() => statusText.Text = "Authenticating...");
        await Authenticate();

        RunOnUiThread (() => statusText.Text = "Syncing...");
        await InitLocalStoreAsync();

        MoveToMainActivity();
    }

    private async Task Authenticate()
    {
        try
        {
            user = await client.LoginAsync(this, MobileServiceAuthenticationProvider.Google);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
    }

    private async Task InitLocalStoreAsync()
    {
        // new code to initialize the SQLite store
        string path = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), localDbFilename);

        if (!File.Exists(path))
        {
            File.Create(path).Dispose();
        }

        var store = new MobileServiceSQLiteStore(path);
        store.DefineTable<ToDoItem>();

        // Uses the default conflict handler, which fails on conflict
        // To use a different conflict handler, pass a parameter to InitializeAsync. For more details, see http://go.microsoft.com/fwlink/?LinkId=521416
        await client.SyncContext.InitializeAsync(store);
    }

如何对其进行重组以避免屏幕闪烁?

1 个答案:

答案 0 :(得分:2)

如果要运行异步方法,则必须使用Task Factory:

RunOnUiThread(() => statusText.Text = "Loading.");
Task.Run(() => AsyncWork()).ContinueWith(result => RunOnUiThread(() => statusText.Text = "Done!"));

屏幕闪烁我觉得它可能是两件事,应用程序崩溃并试图恢复最后一个活动,或者你正在尝试更新UI线程上的元素并进行处理/工作,所以它可能是“口吃”