2011-11-30 183 views
0

我的代碼主要解碼一系列位圖對象,以便稍後在ImageView中顯示。要更好地控制持續時間以顯示每個圖像。所以我在Runnable中實現了代碼。這是可運行的代碼片段。連續循環執行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」不能被賦值爲零。只要「文件[i]」具有文件引用,此代碼就可以工作。只要它一次顯示所有圖像,應用程序只需強制關閉數組就可以處理arrayindexoutofbounds異常。我只想無限地繼續循環。任何指針?

這裏decodeFile()調用另一個函數來重新調整位圖的大小。

回答

0

我不確定你在做什麼,但爲什麼不使用while循環呢?類似while (true) { }會導致無限循環。

+0

對不起,是我不好。那裏沒有「j」循環。編輯的問題。好的,將嘗試while循環。 – user838522

0

我建議一個的AsyncTask

文件意味着數組給出的任務文件,在被處理背景。

位圖意味着你打電話publishProgress與您的位圖,你取它的UI線程上onProgressUpdate

虛空意味着你只是停止一旦完成。

這裏的好處是解碼是在後臺線程上完成的,但iv.setBitmap仍然在UI線程上調用,這是強制性的。

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

似乎不起作用。試過for和while循環。 App強制再次關閉arrayindexoutofbounds異常! – user838522

+0

你不需要while循環或for循環。調用'iv.postdelayed(this,5000);'是一個遞歸調用,它是它自己的邏輯循環。 – kabuko