Как моя простая активность андроида утечка памяти? - PullRequest
2 голосов
/ 01 октября 2011

Моя активность просто отображает изображение:

public class PhotoFrameActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        File externalStorageDir = Environment.getExternalStorageDirectory();
        File picturesDir = new File(externalStorageDir, "DCIM/Camera");
        File[] files = picturesDir.listFiles(new FilenameFilter(){
            public boolean accept(File dir, String name) {
                return name.toLowerCase().endsWith(".jpg");
            }});
        List<File> photoFiles = Arrays.asList(files);
        if (!photoFiles.isEmpty()) {
            try {
                Bitmap currentPhoto = BitmapFactory.decodeStream(new FileInputStream(photoFiles.get(3)));
                ImageView view = (ImageView) findViewById(R.id.photo);
                view.setImageBitmap(currentPhoto);
            } catch (FileNotFoundException e) {
                Log.e("SHOWPIC", "Could not find photo", e);
            }
        }
    }

}

Если действие перезапускается, память не восстанавливается.т.е. если я дважды поверну телефон, я получу следующий ФК:

10-01 17:29:06.011: ERROR/AndroidRuntime(8446): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
10-01 17:29:06.011: ERROR/AndroidRuntime(8446):     at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
10-01 17:29:06.011: ERROR/AndroidRuntime(8446):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:470)
10-01 17:29:06.011: ERROR/AndroidRuntime(8446):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:525)
10-01 17:29:06.011: ERROR/AndroidRuntime(8446):     at net.badgerhunt.photoframe.PhotoFrameActivity.onCreate(PhotoFrameActivity.java:34)

Как я протекаю?

Ответы [ 3 ]

3 голосов
/ 01 октября 2011

Как предположил Яшвант Кумар, это НЕ из-за того, что ваше изображение слишком велико. Даже если вы уменьшите размер выборки, вы все равно (в конце концов) получите OOM. Утечка памяти не будет устранена путем уменьшения размера выборки.

Кажется, у вас утечка памяти. Либо вы можете пойти на поиск утечек памяти и попытаться найти корень вашей проблемы, либо вы можете просто переопределить метод ondestroy своей активности и выполнить

 @Override
    protected void onDestroy() {
        super.onDestroy();
    view.setImageBitmap(null);
    currentPhoto.recycle();
    }

Это обеспечит повторное использование вашего растрового изображения и освобождение памяти при разрушении вашей активности (как в случае переключения ориентации). Однако я бы посоветовал вам посмотреть это видео и в конечном итоге найти корень вашей утечки: http://www.google.com/events/io/2011/sessions/memory-management-for-android-apps.html

3 голосов
/ 01 октября 2011

Когда размер вашего изображения большой, возникает исключение нехватки памяти.Вы должны определить размер выборки в опциях при декодировании потока.как

BitmapFactory.Options options=new BitmapFactory.Options();
options.inSampleSize = 8;
Bitmap preview_bitmap=BitmapFactory.decodeStream(is,null,options);

для получения дополнительной информации см. следующую ссылку.

Странно нехватка памяти при загрузке изображения в растровый объект

0 голосов
/ 01 октября 2011

Я не думаю, что это так (ваше изображение должно быть невероятно большим для устройства Android), но почему бы вам не попробовать закрыть этот поток?

Bitmap currentPhoto = BitmapFactory.decodeStream(new FileInputStream(photoFiles.get(3)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...