#android #multithreading #android-layout #xamarin #android-imageview
#Android #многопоточность #android-макет #xamarin #android-imageview
Вопрос:
У Xamarin
меня есть простое Activity
, которое загружается с пятисекундным ожиданием перед Activity
загрузкой другого.
В первом Activity
есть изображение как часть Layout
, но это изображение не отображается.
Вот мой Activity
код:
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
SetContentView (Resource.Layout.SplashActivity);
Thread.Sleep(5000);
var testActivity = new Intent (this, typeof(TestStartup));
StartActivity (testActivity);
}
Вот мой SplashActivity
код макета:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/background_color">
<ImageView
android:src="@drawable/Splash"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@ id/SplashImage"
android:layout_gravity="center_vertical" />
</LinearLayout>
Приложение ожидает пять секунд, а затем Activity
загружается TestStartup, однако изображение не отображается в течение пяти секунд ожидания. Как я могу отобразить это изображение, пока Activity
ожидание составляет пять секунд?
Могу ли я, пожалуйста, получить некоторую помощь с этим кодом?
Заранее спасибо
Ответ №1:
Оно не отображается, потому что вы блокируете поток пользовательского интерфейса с
Thread.Sleep(5000);
Вы должны избавиться от такого рода логики. Полагаться на x secs
него всегда неправильно. Ожидаемое вами вычисление может быть готово раньше, что делает оставшийся период ожидания огромным или может потребовать большего x secs
. Для "fix"
вашей проблемы вы можете использовать Handler.postDelayed(Runnable, 5000)
и поместить логику, которую вам нужно выполнить внутри run
метода. Таким образом, по крайней мере, поток пользовательского интерфейса не будет заблокирован
Ответ №2:
Возможно, вы захотите взглянуть на руководство Xamarin по созданию заставок в Android:
http://developer.xamarin.com/guides/android/user_interface/creating_a_splash_screen/
Похоже, вы были на правильном пути, но они используют тему, а не устанавливают представление содержимого. Как упоминалось ранее, ваш макет не отображается, потому что ваш метод ожидания блокирует поток пользовательского интерфейса. Использование темы — хороший способ обойти это, и вы можете повторно использовать многое из того, что у вас уже есть.