Android-几秒钟后在运行时更改图像视图源
以下代码用于我的应用程序中的启动屏幕。我需要做的是,当活动加载时,图像应显示为默认值,然后几秒钟后,图像应更改为同一活动中的另一个图像。我有另一个像第一个不同颜色的图像。我想在几秒钟后更改该图像的屏幕 我在代码中就是这样做的Android-几秒钟后在运行时更改图像视图源,android,Android,以下代码用于我的应用程序中的启动屏幕。我需要做的是,当活动加载时,图像应显示为默认值,然后几秒钟后,图像应更改为同一活动中的另一个图像。我有另一个像第一个不同颜色的图像。我想在几秒钟后更改该图像的屏幕 我在代码中就是这样做的 package com.ruchira.busguru; import android.media.MediaPlayer; import android.os.AsyncTask; import android.os.Bundle; import android.app
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$CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图。”
我怎样才能达到这个目标?有人能帮我解决这个问题吗。我不熟悉安卓系统的开发
谢谢。您应该使用ImageView的处理程序和Runnable。处理器是特定于Android的调度程序,它们可以在UI线程上运行。试试这个:
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);
}
});
您应该始终从UI线程本身更新UI…尝试以下操作
我们无法从工作线程访问和更新UI,只能从UIThread访问UI。如果我们需要用后台线程更新它,那么我们可以像下面的代码中那样使用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);
}
};