2013-01-21 35 views
0

我目前正在嘗試啓動一個線程,它從資源中提取drawable並在設定的時間後發佈它。然後從資源中提取下一個drawable,並且完成相同的事情。如何迭代大量具有相似名稱的資源?

final ImageView zImageView = (ImageView) findViewById(R.id.zzz_animation_view); 
    new Thread(new Runnable() { 
     public void run() { 
      for(int i = 1; i<=510; i++) 
      { 
       final Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.z_animation0001); // how do I increment this recourse to z_animation0002, 0003, ..., 0510 ? 
       zImageView.postDelayed(new Runnable() { 
        public void run() { 
         zImageView.setImageBitmap(bitmap); 
        } 
       },200); 
      } 

     } 
    }).start(); 

首先,這是解決問題的正確方法嗎? drawable對於我來說太大了,無法使用animation-list,因此我的目標是一次加載一個圖像,以確保我擁有足夠的內存。其次,我如何解決迭代我的資源的問題?

回答

1

您可以通過使用Resources.getIdentifier其名字來取得資源ID:

final int current = 5; 
final String pattern = "z_animation%04d"; 
final String name = String.format(pattern, current); 
final int id = getResources().getIdentifier(name, "drawable", getPackageName()); 
final Bitmap bitmap = BitmapFactory.decodeResource(getResources(), id); 

此外,here你可以找到我的答案與代碼示例不正是你想要什麼了同樣的問題。

+0

但是,'Resources.getIdentifier'真的很慢,因爲它使用了沉重的反射(我認爲)。當使用很多drawable時,我強烈建議不要使用它。 – Thrakbad

+0

謝謝。太棒了。其中一個問題是:這是如何內存密集?執行此任務時是否需要清理堆? – CodePrimate

+0

@Thrakbad剛剛檢查了'getIdentifier'的實現。它不使用反射,並在本機代碼中實現,所以我認爲你不應該擔心它的性能。無論如何,大部分執行時間將被'BitmapFactory.decodeResource'消耗,實際上getIdentifier如何實現並不重要。 –

相關問題