Java 在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]); } }

全部,

我遇到了与android imageView相关的问题。
我有一个包含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的答案是另一种方法。