Android - 在几秒后在运行时更改图像视图源
Android - 在几秒后在运行时更改图像视图源
以下代码是我的应用程序中的闪屏屏幕。我需要的是当活动加载时,默认显示图像,然后几秒钟后在同一活动中将图像更改为另一个图像。我有另一张与第一张不同颜色的图像。我希望在几秒钟后为该图像更改屏幕。我在我的代码中这样做了。
但问题是程序在执行线程时停止,显示以下错误信息:“android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.”
如何实现这个目标?有人能帮我解决这个问题吗?我是一个新手,对Android开发不熟悉。谢谢。
Android - Change the Image View Source at run time after few seconds这个问题的出现的原因是由于Android中不能在工作线程中访问和更新UI,只能在UI线程中访问UI。如果需要在后台线程中更新UI,可以使用Handler来实现。解决方法是在Handler中使用postDelayed方法延迟一段时间后更新UI的内容。
具体的解决方法如下所示:
首先,在布局文件中定义一个ImageView控件,并设置初始的图片资源为your_first_image。
然后,在Activity中获取ImageView控件的引用,并设置初始的图片资源。
接着,创建一个Handler对象,并在其中定义一个Runnable对象,用于更新UI。
然后,创建一个线程,用于延迟一段时间后执行更新UI的操作。
在线程的run方法中,通过调用Handler的post方法,将更新UI的任务添加到UI线程的消息队列中。
最后,在Runnable对象的run方法中,调用ImageView的setImageResource方法,将图片资源设置为your_second_image_view。
完整的代码如下所示:
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); } };
通过以上方法,我们可以在Android中实现在延迟一段时间后更新ImageView的图片资源的效果。
问题出现的原因是希望在应用程序启动后的几秒钟内更改ImageView的图片源。为了解决这个问题,可以使用ImageView的Handler和Runnable。Handler是Android特有的调度程序,可以在UI线程上运行。具体解决方法如下:
ImageView imgBus; MediaPlayer introSound, bellSound; Runnable swapImage = new Runnable() { 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!
需要注意的是,闪屏屏幕在Android中是不被提倡的,因为应该尽快启动应用程序(同时在后台加载较慢的元素)。然而,有时候稍微延迟是不可避免的。
问题的原因是在Android中,必须在UI线程中更新用户界面。在这个问题中,设置了一个ImageView的资源,但是在非UI线程中进行了更新操作,导致出现了问题。
解决方法是使用runOnUiThread()方法,将更新操作放在UI线程中执行。具体操作是在finally块中添加以下代码:
runOnUiThread(new Runnable() { public void run() { SplashScreen.class.img.setImageResource(R.drawable.bluekbus); } });
这样,就可以确保在UI线程中更新ImageView的资源,避免出现问题。