そのため、作成中のアプリのロード/スプラッシュ画面を作成しようとしています。基本的に、ユーザーが認証されていない場合、ユーザーはアプリの他の部分にアクセスできないはずです。さらに、メインアクティビティをロードする前に、アプリで必要なデータベースオブジェクトの同期を試みたいと思います。
問題は、Authenticate()メソッドとInitLocalStoreAsync()メソッドを呼び出すと、メソッドが実行されている間、画面が点滅することです(アクティビティのリロードのように、またはアプリが理解できないことを実行しているように)。実行中です。それが起こらないようにしたいと思います。
私はAndroidApp Devに非常に慣れておらず、Xamarinにも慣れていません。
認証などに関するAzureMobileServicesチュートリアルからの変更されたコードを使用しています。
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);
}
画面が点滅しないようにこれを再構築するにはどうすればよいですか?
非同期メソッドを実行する場合は、タスクファクトリを使用する必要があります。
RunOnUiThread(() => statusText.Text = "Loading.");
Task.Run(() => AsyncWork()).ContinueWith(result => RunOnUiThread(() => statusText.Text = "Done!"));
画面が点滅します。アプリがクラッシュして最後のアクティビティを回復しようとしている、またはUIスレッドの要素を更新して処理/作業を行っているため、「途切れ」ている可能性があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加