Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android ImageSwitcher OutOfMemoryError_Java_Android_Eclipse_Out Of Memory_Imageswitcher - Fatal编程技术网

Java Android ImageSwitcher OutOfMemoryError

Java Android ImageSwitcher OutOfMemoryError,java,android,eclipse,out-of-memory,imageswitcher,Java,Android,Eclipse,Out Of Memory,Imageswitcher,我正在尝试创建一个ImageSwitcher来浏览DCIM上的相机图像。当我翻阅这些图像时,我得到了一个OutOfMemory错误。如果为每个观看的较大图像分配内存,则这是非常有意义的。我研究过其他类似的问题,但我不知道如何在切换到新图像时释放旧图像的内存 public class MainActivity extends ActionBarActivity { private ImageView imageView; private ImageSwitcher ima

我正在尝试创建一个ImageSwitcher来浏览DCIM上的相机图像。当我翻阅这些图像时,我得到了一个OutOfMemory错误。如果为每个观看的较大图像分配内存,则这是非常有意义的。我研究过其他类似的问题,但我不知道如何在切换到新图像时释放旧图像的内存

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--;
        }
    }
}
解决方案:

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

看看这个库:很好的解决方案!如果您使用的是ImageSwitcher#setImageDrawable,则必须执行setImageDrawable(null);相反