2014-05-07 40 views
0

我想创建一个ImageSwitcher来浏览我的DCIM上的相机图像。当我翻阅图像时,出现OutOfMemory错误。如果将内存分配给每个相当大的图像,这是非常有意义的。我研究过其他类似的问题,但我无法弄清楚如何在切换到新图像时释放旧图像的内存。Android ImageSwitcher OutOfMemoryError

public class MainActivity extends ActionBarActivity { 

    private ImageView  imageView; 
    private ImageSwitcher imageSwitcher; 
    private String  imageDir; 
    private File   imageFile; 
    private String[]  imageNames; 
    private int   i; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main);   

     imageSwitcher = (ImageSwitcher)findViewById(R.id.imageSwitcher1); 
     imageDir  = getString(R.string.image_dir); 
     imageFile  = new File(imageDir); 
     imageNames = imageFile.list(); 
     i    = imageNames.length - 1; 

     imageSwitcher.setFactory(new ViewFactory() { 
      @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
      @Override 
      public View makeView() { 
       // I tried testing for null here but that doesn't work 
       imageView = new ImageView(getApplicationContext()); 
       imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); 
       imageView.setLayoutParams(new 
         ImageSwitcher.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 
       return imageView; 
      } 
     }); 
    } 

    public void previous(View view) { 
     Animation in = AnimationUtils.loadAnimation(this, android.R.anim.slide_out_right); 
     Animation out = AnimationUtils.loadAnimation(this, android.R.anim.slide_in_left); 
     imageSwitcher.setInAnimation(out); 
     imageSwitcher.setOutAnimation(in); 
     Uri imageUri = Uri.parse(imageDir+"/"+imageNames[i]); 
     imageSwitcher.setImageURI(imageUri); 
     decrementImage(); 
    } 

    public void decrementImage() { 
     if (i == 0) { 
      i = imageNames.length - 1; 
     } else { 
      i--; 
     } 
    } 
} 
+0

看看这个库:https://github.com/nostra13/Android-Universal-Image-Loader – Kakarot

回答

1

SOLUTION:

public void previous(View view) { 
    Animation in = AnimationUtils.loadAnimation(this, android.R.anim.slide_out_right); 
    Animation out = AnimationUtils.loadAnimation(this, android.R.anim.slide_in_left); 
    imageSwitcher.setInAnimation(out); 
    imageSwitcher.setOutAnimation(in); 
    Uri imageUri = Uri.parse(imageDir+"/"+imageNames[i]); 
    imageSwitcher.setImageURI(null); // THIS FIXED THE OOM ERROR 
    imageSwitcher.setImageURI(imageUri); 
    decrementImage(); 
} 
+0

伟大的解决方案!如果你使用ImageSwitcher#setImageDrawable,你必须做setImageDrawable(null);代替。 –