因此,我尝试为我正在创建的应用创建加载/启动画面。基本上,如果用户未经过身份验证,那么他们就无法访问应用的其他部分。此外,我希望应用程序在加载主要活动之前尝试同步必要的数据库对象。
问题在于,当我调用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);
}
如何对其进行重组以避免屏幕闪烁?
答案 0 :(得分:2)
如果要运行异步方法,则必须使用Task Factory:
RunOnUiThread(() => statusText.Text = "Loading.");
Task.Run(() => AsyncWork()).ContinueWith(result => RunOnUiThread(() => statusText.Text = "Done!"));
屏幕闪烁我觉得它可能是两件事,应用程序崩溃并试图恢复最后一个活动,或者你正在尝试更新UI线程上的元素并进行处理/工作,所以它可能是“口吃”