MonoDroid ile Thread İçerisinden UI’e Erişme

monodroid_logoBir süredir MonoDroid ile ufak tefek uygulamalar geliştirmeye çalışıyorum. C# gibi güçlü bir dil kullanarak bunu yapmak gerçekten de kolay oluyor ama bazı durumlar da eski alışkanlıklar biraz kafa kurcalıyor. 

Mesela WinForms kısmında Thread içerisinden herhangibir bir UI nesnesine erişmek istediğiniz de ya o UI elementinin invoke methodunu kullanıyorduk yada biraz daha üçkağıt yapıp komple formun invoke methodunu kullanıyorduk. Ama Monodroid kısmında invokelar ne yazık ki yok :) Ufak bir şaşkınlık yaşadım. Git internetten araştır bunun için ne kullanmak gerekiyor diye biraz kızdım ama yapacak birşey.
Neyse ki Monodroid kısmında bunun için kullanılan kod WinForms kısmından daha basit ve sade.
İşte kurtarıcımız.

RunOnUiThread(delegate
{
               button.Text = String.Format(“Uygulama Durumu: {0}”, state);
});

Thread içerisinden neden UI kısmına erişemediğimizi soruyorsanız şöyle diyeyim, UI kısmı ana Thread üzerinden çalışıyor ve biz farklı bir thread üzerinden o kısıma erişmek istiyoruz. Eğer Monodroid de dikkat etmezseniz uygulamanız cart diye kapanıyor. Uyarı yok hata yok güle güle yok, pufff diye gidiyor 😉

Application Output kısmında 

Unhandled Exception:

Android.Util.AndroidRuntimeException: Exception of type ‘Android.Util.AndroidRuntimeException’ was thrown.

at Android.Runtime.JNIEnv.CallVoidMethod (IntPtr jobject, IntPtr jmethod, Android.Runtime.JValue[] parms) [0x00023] in /Users/builder/data/lanes/monodroid-lion-bigsplash/0e0e51f9/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:368

at Android.Widget.TextView.set_TextFormatted (ICharSequence value) [0x00034] in /Users/builder/data/lanes/monodroid-lion-bigsplash/0e0e51f9/source/monodroid/src/Mono.Android/platforms/android-7/src/generated/Android.Widget.TextView.cs:1604

at Android.Widget.TextView.set_Text (System.String value) [0x00013] in /Users/builder/data/lanes/monodroid-lion-bigsplash/0e0e51f9/source/monodroid/src/Mono.Android/platforms/android-7/src/generated/Android.Widget.TextView.cs:1613

at Test.Activity1+<>c__DisplayClass2.b__1 () [0x00007] in c:\Users\MONSTER\Documents\Visual Studio 2012\Projects\Test\Test\Activity1.cs:59

at System.Threading

[ERROR] FATAL UNHANDLED EXCEPTION: Android.Util.AndroidRuntimeException: Exception of type ‘Android.Util.AndroidRuntimeException’ was thrown.

at Android.Runtime.JNIEnv.CallVoidMethod (IntPtr jobject, IntPtr jmethod, Android.Runtime.JValue[] parms) [0x00023] in /Users/builder/data/lanes/monodroid-lion-bigsplash/0e0e51f9/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:368

at Android.Widget.TextView.set_TextFormatted (ICharSequence value) [0x00034] in /Users/builder/data/lanes/monodroid-lion-bigsplash/0e0e51f9/source/monodroid/src/Mono.Android/platforms/android-7/src/generated/Android.Widget.TextView.cs:1604

at Android.Widget.TextView.set_Text (System.String value) [0x00013] in /Users/builder/data/lanes/monodroid-lion-bigsplash/0e0e51f9/source/monodroid/src/Mono.Android/platforms/android-7/src/generated/Android.Widget.TextView.cs:1613

at Test.Activity1+<>c__DisplayClass2.b__1 () [0x00007] in c:\Users\MONSTER\Documents\Visual Studio 2012\Projects\Test\Test\Activity1.cs:59

şeklide bir hata veriyor. Eğer çıkartabilirseniz bir defa System.Threading mesajı geçiyor. Sonrasın da satır numarasına bakıp sorunun ne olacağını düşünüp durursunuz. 

Facebook Comments

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir