【问题标题】:execute the runnable in a continuous loop在连续循环中执行 runnable
【发布时间】:2011-12-01 02:05:42
【问题描述】:

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

 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]”有文件引用,此代码就可以工作。一旦显示所有图像一次,应用程序就会强制关闭对 arrayindexoutofbounds 异常的处理。我只想无限地继续循环。有什么指点吗?

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

【问题讨论】:

    标签: android android-imageview


    【解决方案1】:

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

    【讨论】:

    • 对不起,我的错。那里没有“j”循环。问题已编辑。好的,将尝试 while 循环。
    【解决方案2】:

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

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

    IntentService 可能会很好,并且有很多帮助

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

    【讨论】:

      【解决方案3】:

      我建议使用 AsyncTask

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

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

      Void 意味着一旦完成就停止。

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

      【讨论】:

        【解决方案4】:

        到达终点后只需重置为零:

        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);
        

        【讨论】:

        • 似乎不起作用。尝试了 for 和 while 循环。 App force 再次关闭,出现 arrayindexoutofbounds 异常!
        • 您不需要 while 循环或 for 循环。调用 iv.postdelayed(this, 5000); 是一个递归调用,它是它自己的逻辑循环。
        猜你喜欢
        • 2015-04-14
        • 1970-01-01
        • 1970-01-01
        • 2021-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多