protected virtual void Login() { Loading loading = null; IAsyncTask <Account> task = this.viewModel.Login(); task.OnPreExecute(() => { loading = Loading.Show(); this.loginCommand.Enabled = false; /*by databinding, auto set button.interactable = false. */ }).OnPostExecute((account) => { if (account != null) { /* login success */ this.Dismiss(); this.RaiseOnLoginFinish(true, account); } else { /* Login failure */ var tipContent = this.localization.GetText("login.failure.tip", "Login failure."); Toast.Show(this, tipContent, 2f); } }).OnError(e => { if (log.IsErrorEnabled) { log.Error("OnError:" + e.StackTrace); } var tipContent = this.localization.GetText("login.exception.tip", "Login exception."); Toast.Show(this, tipContent, 2f); }).OnFinish(() => { loading.Dispose(); this.loginCommand.Enabled = true; /*by databinding, auto set button.interactable = true. */ }).Start(); }