Android. Измените источник изображения на время запуска через несколько секунд.

Следующий код предназначен для экрана-заставки в моем приложении. Что мне нужно сделать, это когда активность загружается, изображение должно отображаться по умолчанию, а затем через несколько секунд изображение должно быть изменено на другое в том же самом действии. У меня есть другой образ, похожий на первый цвет с другим цветом. Я хотел изменить экран для этого изображения через несколько секунд.

Я сделал это в моем коде.

package com.ruchira.busguru; import android.media.MediaPlayer; import android.os.AsyncTask; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.graphics.Color; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; import android.widget.RelativeLayout; public class SplashScreen extends Activity { ImageView imgBus; MediaPlayer introSound, bellSound; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.splash_screen); imgBus = (ImageView) findViewById(R.id.imgBus); imgBus.setImageResource(R.drawable.blackbus); introSound = MediaPlayer.create(SplashScreen.this, R.raw.enginestart); introSound.start(); Thread timer = new Thread(){ public void run(){ try{ sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); }finally{ imgBus.setImageResource(R.drawable.bluekbus); } } }; timer.start(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.splash_screen, menu); return true; } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); introSound.stop(); finish(); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); introSound.stop(); finish(); } } 

Но проблема в том, что программа останавливается, выполняя в потоке, говорящий …

"Android.view.ViewRoot $ CalledFromWrongThreadException: только исходный поток, создавший иерархию представлений, может коснуться его представлений".

Как я могу достичь этой цели? Кто-нибудь, пожалуйста, помогите мне разобраться с этой проблемой. Я новичок в разработке Android.

Благодарю.

Solutions Collecting From Web of "Android. Измените источник изображения на время запуска через несколько секунд."

Вы должны использовать Обработчик ImageView и Runnable. Обработчики – это планировщики, специфичные для Android, и они могут работать в потоке пользовательского интерфейса. Попробуй это:

 ImageView imgBus; MediaPlayer introSound, bellSound; Runnable swapImage = new Runnable() { @Override public void run() { imgBus.setImageResource(R.drawable.bluekbus); } }; 

И внутри onCreate() :

 imgBus = (ImageView) findViewById(R.id.imgBus); imgBus.setImageResource(R.drawable.blackbus); imgBus.postDelayed(swapImage, 3000); // Add me! 

Поймите, что экраны заставки не одобряются, потому что вам следует сосредоточиться на запуске приложения как можно скорее (при загрузке более медленного элемента в фоновом режиме). Однако иногда небольшая задержка неизбежна.

Запишите это внутри наконец

 runOnUiThread(new Runnable() { public void run() { SplashScreen.class.img.setImageResource(R.drawable.bluekbus); } }); 

Вы всегда должны обновлять свой пользовательский интерфейс непосредственно из потока пользовательского интерфейса …

Попробуйте следующее:

Мы не можем получить доступ и обновить пользовательский интерфейс из рабочих потоков, только мы можем получить доступ к пользовательскому интерфейсу из UIThread. Если нам нужно обновить фоновый поток, мы можем использовать Handler для этого, как в следующем коде.

  this.imgBus = (ImageView) findViewById(R.id.splashImageView); imgBus.setImageResource(R.drawable.your_first_image); this.handler = new Handler(); introSound = MediaPlayer.create(SplashTestForSO.this, R.raw.enginestart); introSound.start(); Thread timer = new Thread(){ public void run(){ try{ sleep(2000); YourActivity.this.handler.post(runnable); sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); }finally{ } } }; timer.start(); this.runnable = new Runnable() { public void run() { //call the activity method that updates the UI YourActivity.this.imgBus.setImageResource(R.drawable.your_scond_image_view); } };