Android: 按照时间间隔更改图像
Android: 按照时间间隔更改图像
我正在使用ImageDownloader
类从服务器获取图片,并使用ArrayList获取这些图片的链接。下载图片后,我将其设置为布局的background
。一切都正常,但是我想在特定的时间间隔
后更改这些图片,并设置不同的图片作为背景。我在这里阅读了很多帖子,但没有得到我想要的结果。由于我在ArrayList中有所有的图片链接,所以我应该如何设置一个计时器来更改从ArrayList
中获取的图片呢?即使我设置了一个计时器,它总是显示索引0处的第一张图片,同样的图片又再次显示出来?如果有人有任何代码示例,请帮助我查看我的代码需要做哪些更改。
final ImagesSerialized item; final ImageView bgImage=(ImageView) findViewById(R.id.image); ArrayListlist; control = (Controller) getApplicationContext(); list = (ArrayList ) control.Table_Images.GetData(); for(int i=0; i
问题的原因是在循环中,每次都会调用runOnUiThread()方法,导致图片的更换没有间隔时间。
解决方法是使用Handler类实现定时任务,在定时任务中更换图片。
代码如下所示:
final ImagesSerialized item; final ImageView bgImage=(ImageView) findViewById(R.id.image); ArrayList<ImagesSerialized> list; control = (Controller) getApplicationContext(); list = (ArrayList<ImagesSerialized>) control.Table_Images.GetData(); final Handler handler = new Handler(); final int delay = 2000; // 设置时间间隔,单位为毫秒 Runnable runnable = new Runnable() { int i = 0; public void run() { item = list.get(i); downloader = new ImageDownloader(); downloader.download(item.imageurl(), bgImage); i++; if (i >= list.size()) { i = 0; } handler.postDelayed(this, delay); } }; handler.postDelayed(runnable, delay);
问题原因:需要在Android应用中实现定时更换图片的功能。
解决方法:可以使用TimerTask来实现。
首先,需要在布局文件中设置ImageView的属性,如下所示:
然后,在代码中进行一些声明和初始化操作,如下所示:
ListmImageUrl = new ArrayList (); private ImageLoader mImageLoader = new ImageLoader(MainActivity.this); Timer timer = new Timer(); int i = 0;
接下来,在onCreate方法中添加以下代码:
timer.scheduleAtFixedRate(new TimerTask() { public void run() { if (i < mImageUrl.size()) { runOnUiThread(new Runnable() { public void run() { mImageLoader.DisplayImage(mImageUrl.get(i), img); i++; } }); } else { i = 0; } } }, 0, 2000);
这段代码会在0秒开始执行,并且每2秒更换一次图片。您可以根据需要调整时间间隔。
以上代码已经经过测试,可以正常工作。
如果想了解更多关于TimerTask的信息,可以点击[这里](http://developer.android.com/reference/java/util/TimerTask.html)。
另外,如果需要取消定时器,可以使用
timer.cancel()
方法。
问题的出现原因:用户想要在Android应用中实现定时更换图片的功能,但不清楚如何实现。
解决方法:
1. 首先,用户可以使用Android中的ImageView
组件来实现定时更换图片的功能。通过在该组件上调度一个定时器即可实现,而无需引入其他对象。
代码如下:
final ImageView bgImage=(ImageView) findViewById(R.id.image); ... new Runnable() { int updateInterval = 1000; // 每隔1秒执行一次 public void run() { // 在这里写需要执行的代码,每隔updateInterval时间会执行一次 // 在这里更换背景图片 bgImage.postDelayed(this, updateInterval); } }.run();
2. 如果用户想要停止定时器,可以在Runnable
中添加一个停止方法。这个停止方法是同步的,不会导致定时器内部代码的不一致性。
代码如下:
Runnable myRunnable = new Runnable() { int updateInterval = 1000; // 每隔1秒执行一次 boolean stop = false; public void stop() { this.stop = true; } public void run() { // 在这里写需要执行的代码,每隔updateInterval时间会执行一次 // 在这里更换背景图片 if(!stop) { bgImage.postDelayed(this, updateInterval); } } }.run();
现在可以通过myRunnable.stop();
来停止定时器。
3. 如果用户想要按照一定的时间间隔循环遍历URL数组,并将其中的一个URL传递给下载器进行下载并设置为背景图片,可以使用以下代码片段实现:
int arraySize = list.size(); new Runnable() { int currentIndex = 0; int updateInterval = 1000; // 每隔1秒执行一次 public void run() { currentIndex += 1; if(currentIndex == arraySize){ currentIndex = 0; } item = list.get(currentIndex); downloader.download(item.imageurl(), bgImage); bgImage.postDelayed(this, updateInterval); } }.run();
用户在服务器上使用ArrayList
获取图片URL,然后使用一个对象来访问这些URL。现在的问题是如何按照一定的时间间隔逐个更改这些URL,并将它们传递给下载器方法,该方法会下载图片并将其设置为传递给它的视图的背景。用户希望了解如何在这种情况下使用线程。
用户在这行代码中遇到了问题:downloader.download(item.imageurl(), bgImage);
,其中item.imageurl()
是一个字符串,用户想要逐个传递索引值。
最后,用户感谢对方在解决问题时花费的时间。