在连续循环中执行runnable

时间:2011-11-30 16:53:55

标签: android android-imageview

我的代码主要解码一系列位图对象,以便稍后在ImageView中显示。要更好地控制显示每个图像的持续时间。所以我在Runnable中实现了代码。这是可运行的片段。

 final File file[]=dir.listFiles();
 iv.postDelayed(
                 new Runnable() {

                     @Override
                     public void run() {

                         i++;



                        Bitmap bitmap = decodeFile(file[i]);

                        iv.setImageBitmap(bitmap);


                        iv.postDelayed(this, 5000);






    }
    }, 5000);

但是,我似乎没有很好地控制循环。我无法使用for循环,因为在这种情况下“i”不能指定为零。只要“file [i]”具有File引用,此代码就可以工作。一旦它显示所有图像一次,应用程序只需强制关闭do到arrayindexoutofbounds异常。我只想无限地继续循环。有什么指针吗?

这里decodeFile()调用另一个函数来重新调整位图的大小。

4 个答案:

答案 0 :(得分:0)

我不确定你在做什么,但为什么不使用while循环呢?像while (true) { }之类的东西会导致无限循环。

答案 1 :(得分:0)

感觉你想要做一些可能需要一段时间的工作并且你想要重复它,尝试查看一个名为service的android组件并按意图发送它。

http://developer.android.com/guide/topics/fundamentals/services.html

可能是一个IntentService很好,并且帮助很多

http://developer.android.com/reference/android/app/IntentService.html

答案 2 :(得分:0)

我建议使用AsyncTask

文件意味着文件数组被赋予要在后台处理的任务。

位图意味着你用你的位图调用publishProgress,你可以在onProgressUpdate的UI线程上获取它

虚空意味着一旦完成就会停止。

这里的好处是解码是在后台线程上完成的,但仍然在UI线程上调用iv.setBitmap,这是强制性的。

答案 3 :(得分:0)

一旦到达终点,只需重置为零:

final File file[]=dir.listFiles();
iv.postDelayed(
             new Runnable() {
                 @Override
                 public void run() {
                     if (i == file.length) {
                         i = 0;
                     }
                     else {
                         i++;
                     }

                    Bitmap bitmap = decodeFile(file[i]);
                    iv.setImageBitmap(bitmap);
                    iv.postDelayed(this, 5000);
                }
            }, 5000);