Форум программистов, компьютерный форум CyberForum.ru

Не понимаю нехватку памяти - Android

Восстановить пароль Регистрация
 
Tro0P
0 / 0 / 0
Регистрация: 14.11.2015
Сообщений: 24
18.01.2016, 15:26     Не понимаю нехватку памяти #1
в программе выбираю картинки и вывожу их на экран в imageview. ImageView создаю во время работы программы.
На 5ой! картинке выбрасывает исключение
java.lang.OutOfMemoryError: Failed to allocate a 31961100 byte allocation with 4194208 free bytes and 4MB until OOM
как обойти это ограничение памяти?

на всякий случай код
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.putExtra("return-data", true);
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent,
                        "Select Picture"), 1);
            }
 
 
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 1 && resultCode == RESULT_OK) {
            Uri uri = data.getData();
            linkList.add(uri.toString());
            ImageView img=new ImageView(this);
            img.setId(View.generateViewId());
            preopenLayout.addView(img, preopenLayout.getWidth() / 2, preopenLayout.getWidth() / 2);
            img.setImageURI(uri);
        } if (requestCode==2 && resultCode==RESULT_OK) {
            linkList.add(data.getStringExtra("link"));
            linkView.setText(linkView.getText()+data.getStringExtra("link")+"\n");
        }
        super.onActivityResult(requestCode, resultCode, data);
    }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
YuraAAA
 Аватар для YuraAAA
1563 / 1305 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
18.01.2016, 15:30     Не понимаю нехватку памяти #2
Tro0P,
Цитата Сообщение от Tro0P Посмотреть сообщение
Failed to allocate a 31961100 byte allocation with 4194208 free bytes and 4MB until OOM
А как Вы собираетесь обойти это? 30мб памяти...
Сжимайте картинки перед тем как ставить их в ImageView
Lumber
81 / 81 / 30
Регистрация: 02.12.2015
Сообщений: 210
18.01.2016, 16:30     Не понимаю нехватку памяти #3
Я так понимаю одна картинка ~30 мб весит. И загружается их несколько одновременно. Конечно память быстро закончится. Если предыдущие картинки такие же - 120 мб прога взяла, при попытке взять ещё 30 упала.

Непонятно что должно быть на экране, если сразу много картинок, то нужно уменьшить разрешение (сжатие неважно - при загрузке они всё равно разжимаются). У вас сейчас картинки по 10 мегапикселей примерно. Нужно ли столько? Даже если просматривать на полном экране FullHD - это два мегапикселя.

Картинки стоит масштабировать при загрузке в сторону уменьшения. Исходить из того что один пиксель занимает 3 байта.

Если же надо в полном разрешении всё-таки загружать (для увеличения например) - то стоит это делать по одной картинке за раз, а которые не нужны не надо в памяти держать (а сейчас все загруженные в памяти остаются). Или (в зависимости от того что должна программа делать) в памяти держать мелкие preview, а при увеличении загружать более высокого разрешения.
Tro0P
0 / 0 / 0
Регистрация: 14.11.2015
Сообщений: 24
18.01.2016, 18:37  [ТС]     Не понимаю нехватку памяти #4
понял, пытаюсь переделать пример отсюда http://developer-android.unlimited-t...ss-bitmap.html
так как у меня есть uri-путь к файлу меняю
Java
1
decodeResourse
на
Java
1
decodeFile
получается след. код:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  public static Bitmap decodeSampledBitmapFromResource(String uri,
                                                         int reqWidth, int reqHeight) {
 
        // First decode with inJustDecodeBounds=true to check dimensions
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(uri, options);
 
        // Calculate inSampleSize
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
 
        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeFile(uri, options);
    }
вызывается метод :
Java
1
 img.setImageBitmap(decodeSampledBitmapFromResource(uri.getPath(), relativeLayout.getWidth() / 2, relativeLayout.getWidth() / 2));
в итоге получается пустое ImageView... подскажите в чем проблема??7

uri получаю из интента
Java
1
2
3
 intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent,
                        "Select Picture"), 1);
в логах проскакивает
01-18 18:30:26.248 29377-29377/pc.vorgul.myappforwork E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /document/image:896: open failed: ENOENT (No such file or directory)
01-18 18:30:26.249 29377-29377/pc.vorgul.myappforwork E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /document/image:896: open failed: ENOENT (No such file or directory)
Lumber
81 / 81 / 30
Регистрация: 02.12.2015
Сообщений: 210
18.01.2016, 19:58     Не понимаю нехватку памяти #5
А в интенте откуда Uri берется? Там точно имя файла?

"/document/image:896:" - это что? не похоже на имя файла.
Tro0P
0 / 0 / 0
Регистрация: 14.11.2015
Сообщений: 24
18.01.2016, 20:24  [ТС]     Не понимаю нехватку памяти #6
обработчик для этого интента получает Uri к выбранному файлу.
Если использовать ImageView.setImageUri(uri), то загружается выбранный файл
Java
1
2
3
4
5
6
7
8
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 1 && resultCode == RESULT_OK) {
            Uri uri = data.getData();
            linkList.add(uri.toString());
            ImageView img=new ImageView(this);
            img.setId(View.generateViewId());
            preopenLayout.addView(img, relativeLayout.getWidth() / 2, relativeLayout.getWidth() / 2);
            img.setImageURI(uri);
дальше делаю

Java
1
img.setImageBitmap(decodeSampledBitmapFromResource(uri.getPath(), relativeLayout.getWidth() / 2, relativeLayout.getWidth() / 2));
с этим же uri
Lumber
81 / 81 / 30
Регистрация: 02.12.2015
Сообщений: 210
19.01.2016, 00:34     Не понимаю нехватку памяти #7
Ну значит путь из Uri извлекается не правильно. Это не путь в файловой системе. Он может возвращать путь для content provider'а или ещё что-то непонятное.

вот рекомендуют так делать (я не проверял):
Java
1
2
File imageFile = new File(uri.getPath());
String fileName = imageFile.getAbsolutePath();
Tro0P
0 / 0 / 0
Регистрация: 14.11.2015
Сообщений: 24
19.01.2016, 00:52  [ТС]     Не понимаю нехватку памяти #8
я понимаю, что где-то работает не так как мне кажется, просто не могу понять как исправить
переделал
Java
1
2
3
4
5
6
7
8
9
 Uri uri = data.getData();
            File imageFile = new File(uri.getPath());
            String fileName = imageFile.getAbsolutePath();
            linkList.add(uri.toString());
            ImageView img=new ImageView(this);
            img.setId(View.generateViewId());
            preopenLayout.addView(img, relativeLayout.getWidth() / 2, relativeLayout.getWidth() / 2);
           // img.setImageURI(uri);
            img.setImageBitmap(decodeSampledBitmapFromResource(fileName, relativeLayout.getWidth() / 2, relativeLayout.getWidth() / 2));
результат тот же...
Lumber
81 / 81 / 30
Регистрация: 02.12.2015
Сообщений: 210
19.01.2016, 01:10     Не понимаю нехватку памяти #9
надо в отладчике посмотреть что в итоге оказывается в fileName.

вот ещё вариант вообще без преобразования Uri в строку:
Java
1
2
3
InputStream is = getContentResolver().openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(is);
is.close();
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,488
20.01.2016, 04:22     Не понимаю нехватку памяти #10
Цитата Сообщение от Lumber Посмотреть сообщение
Я так понимаю одна картинка ~30 мб весит. И загружается их несколько одновременно. Конечно память быстро закончится.
А как можно узнать СКОЛЬКО памяти занято в андроиде? Как она растет? Сколько занимает моя программа?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2016, 05:40     Не понимаю нехватку памяти
Еще ссылки по теме:

Android View Pager разные фрагменты на страницах, не понимаю как?
Дамп памяти Android
Утечка памяти Android
Android Filterable не понимаю как в адаптере взять String значение по позиции ?
Колличество обращений к памяти Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Lumber
81 / 81 / 30
Регистрация: 02.12.2015
Сообщений: 210
20.01.2016, 05:40     Не понимаю нехватку памяти #11
Цитата Сообщение от Tester64 Посмотреть сообщение
А как можно узнать СКОЛЬКО памяти занято в андроиде? Как она растет? Сколько занимает моя программа?
В Android Device Monitor можно много чего смотреть в том числе и про память. Сколько памяти, что там находится ...
Yandex
Объявления
20.01.2016, 05:40     Не понимаю нехватку памяти
Ответ Создать тему
Опции темы

Текущее время: 00:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru