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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
klim76
12 / 12 / 2
Регистрация: 10.06.2016
Сообщений: 114
#1

Java.lang.OutOfMemoryError - Android

12.09.2016, 00:18. Просмотров 198. Ответов 6
Метки нет (Все метки)

Помогите, падает приложение с ошибкой нехватки памяти. Делаю добавление фото из галереи телефона, и на 4-5м снимке приложение падает.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
FATAL EXCEPTION: main
                                                                              Theme: themes:{}
                                                                              java.lang.OutOfMemoryError: Failed to allocate a 20155404 byte allocation with 620080 free bytes and 605KB until OOM
                                                                                  at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
                                                                                  at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
                                                                                  at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:635)
                                                                                  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:611)
                                                                                  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:649)
                                                                                  at erpico.mobile.android.bus4us.Fragments.FeedbackFragmen.onActivityResult(FeedbackFragmen.java:94)
                                                                                  at android.app.Activity.dispatchActivityResult(Activity.java:6480)
                                                                                  at android.app.ActivityThread.deliverResults(ActivityThread.java:3729)
                                                                                  at android.app.ActivityThread.handleSendResult(ActivityThread.java:3776)
                                                                                  at android.app.ActivityThread.-wrap16(ActivityThread.java)
                                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1412)
                                                                                  at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                  at android.os.Looper.loop(Looper.java:148)
                                                                                  at android.app.ActivityThread.main(ActivityThread.java:5461)
                                                                                  at java.lang.reflect.Method.invoke(Native Method)
                                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Собственно выбор и добавление картинки во фрагмент:
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
27
28
29
30
31
32
33
34
35
36
@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch(requestCode) {
            case 100:
                if(resultCode == Activity.RESULT_OK){
                    Uri selectedImage = data.getData();
                    InputStream imageStream = null;
                    try {
                        imageStream = getActivity().getContentResolver().openInputStream(selectedImage);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                    Bitmap SelectedImage = BitmapFactory.decodeStream(imageStream);
                    SetNewImage(SelectedImage);
                }
                break;
        }
    }
 
    private void SetNewImage(Bitmap b){
        if(b == null)
            return;
 
        int countImages = llImageHost.getChildCount();
        View tmpView = llImageHost.getChildAt(countImages-1);
 
        llImageHost.removeViewAt(countImages-1);
        ImageView addedView = new ImageView(getActivity());
        addedView.setImageBitmap(b);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(60,60);
        params.setMargins(5,5,5,5);
        addedView.setLayoutParams(params);
        llImageHost.addView(addedView);
        llImageHost.addView(tmpView);
    }
Решение написано "влоб", Подскажите как исправить
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Lumber
96 / 96 / 36
Регистрация: 02.12.2015
Сообщений: 236
12.09.2016, 00:43     Java.lang.OutOfMemoryError #2
Значит фотки большие, их надо уменьшать до необходимого размера (до размера в каком они будут на экране показываться). JPG декодируется и они в памяти занимают намного больше места. 3 (или 4?) байта на пиксель.
klim76
12 / 12 / 2
Регистрация: 10.06.2016
Сообщений: 114
12.09.2016, 00:48  [ТС]     Java.lang.OutOfMemoryError #3
Lumber, Ну да, фоты с камеры нащелканные. Подскажите как их "ужать" в размере?
Mikalai
253 / 229 / 92
Регистрация: 11.01.2015
Сообщений: 648
12.09.2016, 00:52     Java.lang.OutOfMemoryError #4
klim76, вот тут почитай.
Lumber
96 / 96 / 36
Регистрация: 02.12.2015
Сообщений: 236
12.09.2016, 00:54     Java.lang.OutOfMemoryError #5
для декодирования использовать вот этот метод:

decodeStream(InputStream is, Rect outPadding, BitmapFactory.Options opts)

в BitmapFactory.Options можно задать размер (outHeight, outWidth).
klim76
12 / 12 / 2
Регистрация: 10.06.2016
Сообщений: 114
12.09.2016, 10:34  [ТС]     Java.lang.OutOfMemoryError #6
Еще вопрос в догонку. В разметке под превью картинки предусмотрен ImageView с шириной и длиной "60dp"
а в коде я делаю -
Java
1
2
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(60,60);
        params.setMargins(5,5,5,5);
т.е. размер жестко в пикселях. Это нормально будет работать или в коде тоже как то можно "60dp" задать?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2016, 10:41     Java.lang.OutOfMemoryError
Еще ссылки по теме:

Android Array type expected; found: 'java.lang.string'
Java.lang.OutOfMemoryError на Samsung Galaxy Android
Android Ava.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String[] link.stuzer.stattrack.data
Java.lang.NumberFormatException: Invalid double Android
Ошибка java.lang.NullPointerException Android

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

Или воспользуйтесь поиском по форуму:
Паблито
резкий
1961 / 1696 / 525
Регистрация: 12.05.2014
Сообщений: 6,046
Завершенные тесты: 1
12.09.2016, 10:41     Java.lang.OutOfMemoryError #7
Цитата Сообщение от klim76 Посмотреть сообщение
или в коде тоже как то можно "60dp" задать
Java
1
int w = getResources().getDimensionPixelSize(R.dimen.ololo_width);
Yandex
Объявления
12.09.2016, 10:41     Java.lang.OutOfMemoryError
Ответ Создать тему
Опции темы

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