Java 在android的imageView中动态更改位图
全部, 我遇到了与android imageView相关的问题。Java 在android的imageView中动态更改位图,java,android,multithreading,bitmap,Java,Android,Multithreading,Bitmap,全部, 我遇到了与android imageView相关的问题。 我有一个包含10个位图对象的数组,称为bm 我有一个图像视图,名为im 现在我想在im中逐个显示数组中的位图,所以我做了以下操作: new Thread(new Runnable() { public void run() { for(int j=0;j<10;j++){ im.setImageBitmap(bm[j]); } }
我有一个包含10个位图对象的数组,称为
bm
我有一个图像视图,名为
im
现在我想在im中逐个显示数组中的位图,所以我做了以下操作:
new Thread(new Runnable() {
public void run() {
for(int j=0;j<10;j++){
im.setImageBitmap(bm[j]);
}
}
}).start();
new线程(new Runnable()){
公开募捐{
对于(int j=0;j您需要在设置新图像后插入sleep
调用,以便您的眼睛有机会看到图像:)。类似于:
im.setImageBitmap(bm[j]);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
在进入下一个图像之前,应将图像保留五秒钟
像其他人建议的那样,您需要使用postDelayed
正确地通知UI您正在设置位图
您应该有异常,因为您只能在UI线程中使用视图。
若要对视图进行更改,则应在视图上调用方法
事实上,它变化如此之快,以至于您只能看到最后一项
下面是正确的代码:
new Thread(new Runnable() {
public void run()
{
for (int j = 0; j < 10; j++)
{
final int index = j;
im.postDelayed(new Runnable() {
@Override
public void run()
{
im.setImageBitmap(bm[index]);
}
}, j * 1000); // delay j seconds
}
}
}).start();
new线程(new Runnable()){
公开募捐
{
对于(int j=0;j<10;j++)
{
最终int指数=j;
im.postDelayed(新的Runnable(){
@凌驾
公开募捐
{
im.setImageBitmap(bm[index]);
}
},j*1000);//延迟j秒
}
}
}).start();
永远不要更改线程中的UI元素。大多数情况下,这会导致异常。我不知道为什么它不在这里
在短短的几毫秒内,你就可以快速浏览所有的十张图片。这就是为什么最后一张是你看到的唯一一张。你需要放慢速度
最简单的方法是处理程序/可运行实现,如下所示:
im.post(new Runnable() {
int j = 0;
@Override
public void run() {
im.setImageBitmap(bm[j]);
if(j++ < 10){
im.postDelayed(this, 1000);
}
}
});
im.post(新的Runnable(){
int j=0;
@凌驾
公开募捐{
im.setImageBitmap(bm[j]);
if(j++<10){
im.postdayed(本次为1000);
}
}
});
顺便说一句,这段代码在活动的onCreate()方法中。我仍然认为创建这样一个线程会有些过分。不管发生什么,它都必须在UI上运行。方法“postdayed”是在UI线程上调用的,我遗漏了什么吗?是的,但是您也创建了一个线程来循环10次,以调用UI线程上的方法。这会起作用,但似乎是多余的。谢谢,我刚刚尝试了您的代码,但eclipse说“不能引用在不同方法中定义的内部类中的非最终变量j”谢谢你,先生,你刚才说永远不要更改线程中的UI元素,那么最好的方法是什么呢?这是在UI线程上运行的,所以这是一种可以做到的方法。Dmytro的答案是另一种方法。