2015-02-10 3 views
2

Я делаю приложение для Android, которое может транслировать видео с сервера на Android-мобильную. У меня правильная работа с изображением и работа, но через 15 секунд приложение аварийно завершает работу. Мне удалось отследить это до Throwing OutOfMemoryError. Я попытался переработать битмап после того, как я передал ему интерфейс, чтобы передать его в поток, чтобы отобразить его, но я получаю сообщение об ошибке «неспособное повторно использовать переработанный битмап». Я не уверен, как исправить эту ошибку, или даже если она будет наклонена, это исправит.Android Throwing OutOfMemoryError on App

    int read_count = 1; 
        long start_time = System.currentTimeMillis(); 
        long timeout = 10000; 
        boolean timed_out = false; 

        byte[] data = new byte[size + 1]; 
        while (read_count < size && !timed_out) 
        { 
         int len = in.read(data, read_count, size - read_count); 
         read_count += len; 
         timed_out = (System.currentTimeMillis() - start_time) >= timeout; 
        } 
        data[0] = (byte)0x89; 

        if (read_count == size) 
        { 
         final boolean is_left = (side == 0); 
         final byte[] tmp = data; 
         Bitmap Image_data = null; 
         System.out.println(tmp.length); 
         if (Listener != null) 
         { 
          Image_data = BitmapFactory.decodeByteArray(tmp, 0, tmp.length); 

          Listener.OnNewImageListenerBitmap(Image_data, is_left); 

          // this is where i tried recycling it// 
         } 

        } 

я сумел отслеживать ошибки памяти в строке «байт [] данных = новый байт [размер + 1];» но после исследования у меня создается впечатление, что это связано с растровым изображением.

У кого-нибудь еще была проблема с этой проблемой и удалось ее исправить? любая помощь по этому вопросу было бы удивительным: D

Благодаря

LOGCATOUTPUT:

02-10 15:22:15.488 32097-32122/com.google.vrtoolkit.cardboard.samples.treasurehunt I/System.out﹕ 373348 
 
02-10 15:22:16.655 32097-32122/com.google.vrtoolkit.cardboard.samples.treasurehunt I/System.out﹕ 373348 
 
02-10 15:22:17.371 32097-32122/com.google.vrtoolkit.cardboard.samples.treasurehunt I/System.out﹕ 373348 
 
02-10 15:22:18.827 32097-32122/com.google.vrtoolkit.cardboard.samples.treasurehunt I/System.out﹕ 373348 
 
02-10 15:22:29.167 32097-32122/com.google.vrtoolkit.cardboard.samples.treasurehunt I/art﹕ Alloc sticky concurrent mark sweep GC freed 37627(1380KB) AllocSpace objects, 0(0B) LOS objects, 6% free, 114MB/122MB, paused 905us total 7.018ms 
 
02-10 15:22:29.178 32097-32122/com.google.vrtoolkit.cardboard.samples.treasurehunt I/art﹕ Alloc partial concurrent mark sweep GC freed 110(3KB) AllocSpace objects, 2(92MB) LOS objects, 40% free, 22MB/36MB, paused 1.112ms total 11.404ms 
 
02-10 15:22:29.202 32097-32122/com.google.vrtoolkit.cardboard.samples.treasurehunt I/art﹕ Alloc concurrent mark sweep GC freed 141(17KB) AllocSpace objects, 0(0B) LOS objects, 40% free, 22MB/36MB, paused 825us total 23.893ms 
 
02-10 15:22:29.202 32097-32122/com.google.vrtoolkit.cardboard.samples.treasurehunt I/art﹕ Forcing collection of SoftReferences for 1GB allocation 
 
02-10 15:22:29.223 32097-32122/com.google.vrtoolkit.cardboard.samples.treasurehunt I/art﹕ Alloc concurrent mark sweep GC freed 67(2520B) AllocSpace objects, 0(0B) LOS objects, 39% free, 22MB/36MB, paused 2.473ms total 18.440ms 
 
02-10 15:22:29.223 32097-32122/com.google.vrtoolkit.cardboard.samples.treasurehunt E/art﹕ Throwing OutOfMemoryError "Failed to allocate a 1801149826 byte allocation with 15419532 free bytes and 233MB until OOM" 
 
02-10 15:22:29.223 32097-32122/com.google.vrtoolkit.cardboard.samples.treasurehunt E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-1308 
 
    Process: com.google.vrtoolkit.cardboard.samples.treasurehunt, PID: 32097 
 
    java.lang.OutOfMemoryError: Failed to allocate a 1801149826 byte allocation with 15419532 free bytes and 233MB until OOM 
 
      at Socket.ClientThread.run(ClientThread.java:130) 
 
02-10 15:22:29.833 32097-32121/com.google.vrtoolkit.cardboard.samples.treasurehunt I/MainActivity﹕ onRendererShutdown 
 
02-10 15:22:32.793 32097-32122/com.google.vrtoolkit.cardboard.samples.treasurehunt I/Process﹕ Sending signal. PID: 32097 SIG: 9

+0

Возможный дубликат [Незначительная ошибка при загрузке изображения в объект Bitmap] (http://stackoverflow.com/questions/477572/strange-out-of-memory-issue-while-loading-an- image-to-a-bitmap-object) – SMR

+0

Я попытался посмотреть на это и использовать это решение, и это не сработало в моем случае – user3774031

ответ

5

Если бы подобный вопрос на Android 5. Перемещение изображения в/вытяжке-nodpi вместо/вытяжка.

EDIT: Я думаю, что это имеет какое-то отношение к автоматическому масштабированию изображения с использованием текущего устройства DPI. Например, если у вас есть большое изображение только в/drawable-mdpi, но ваше устройство - xxxhdpi, тогда Android отображает изображение, доступное в mdpi, и пытается масштабировать его до соответствия xxxhdpi, что может занимать слишком много памяти. Но изображения из/drawable-nodpi не масштабируются, они используются как есть.

+0

Исправлена ​​проблема для меня +1. – bhai

+0

Спасибо .. это работает для меня также .. может у объяснить мне, как он работает ?? –

+0

Отредактирован ответ – Borzh