Zdarzenie Button Click

0

Witam. Chciałbym wiedzieć, czy jest możliwość w androidzie, aby kod który jest wykonywany przy zdarzeniu Click wykonywał się linijka po linijce, i na bieżąco aktualizował widok aplikacji?
Na przykładzie:
Dodałem do zdarzenia Click taki kod:

Button b1 = FindViewById<Button>(Resource.Id.button1);
b1.Click += delegate
                {
                    Toast.MakeText(ApplicationContext, "Hello", ToastLength.Long).Show();
                    Thread.Sleep(5000);
                    Toast.MakeText(ApplicationContext, "World", ToastLength.Long).Show();
                };

Moim celem było, by aplikacja po kliknięciu przycisku wyświetliła napis Hello, a 5 sekund póżniej napis World. Przy takim kodzie po kliknięciu przycisku program nie odpowiada przez 5 sekund, a następnie wyświetla tylko napis World. Zupełnie jakby kod najpierw wykonywał się cały, a potem program wyświetlał rezultaty. Jak to zmienić? Próbowałem też takiej metody:

Button b1 = FindViewById<Button>(Resource.Id.button1);
b1.Click += HandleClick
void HandleClick(object sender, EventArgs ea)
                {
                    Toast.MakeText(ApplicationContext, "Hello", ToastLength.Long).Show();
                    Thread.Sleep(5000);
                    Toast.MakeText(ApplicationContext, "World", ToastLength.Long).Show();
                };

Ale rezultat był taki sam.

0

Program robi dokładnie to, co ma zrobić. Czyli wyświetla napis, czeka, a potem wyświetla drugi. Zamrażasz cały główny wątek, więc czego się spodziewasz? Poczytaj o wątkach, async i await.

2

@Juhas: Nie, W takiej wersji jak napisał @Daniel Włudarczyk program nie wyświetli pierwszego Toasta. Chyba wątek UI się zamraża sleepem. Można użyć timera.

protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            // Set our view from the "main" layout resource
            SetContentView (Resource.Layout.Main);
            button = (Button)FindViewById(Resource.Id.button1);

            button.Click += Button_Click;
            
            timer = new Timer();
            timer.Interval = 5000;
            timer.Elapsed += Timer_Elapsed;
        }

        private void Button_Click(object sender, System.EventArgs e)
        {
            Toast.MakeText(ApplicationContext, "Hello", ToastLength.Short).Show();

            
            timer.Start();
        }

        private void Timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            timer.Stop();
            RunOnUiThread(() =>
            {
                Toast.MakeText(ApplicationContext, "World", ToastLength.Short).Show();
            });
        }

albo jak chcesz na delegatach

button.Click += delegate {
                Toast.MakeText(ApplicationContext, "Hello", ToastLength.Short).Show();
                Timer timer = new Timer();
                timer.Interval = 5000;
                timer.Start();
                timer.Elapsed += delegate {
                    timer.Stop();
                    RunOnUiThread(() =>
                    {
                        Toast.MakeText(ApplicationContext, "World", ToastLength.Short).Show();
                    });
                };
            };
0

Chyba racja. Nie wiem, jak na Androidzie, ale w WinForms można poradzić sobie z tym przez ręczne ogarnięcie pętli komunikatów (Application.DoEvents()).

0

Tak myślałem, że to nie może być takie proste. Dziękuję bardzo za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1