2016-11-07 4 views
0

Я загружаю несколько изображений с моего сервера и использую их в списке. Убедившись, что изображения были фактически загружены (через службу), я загружаю их в объект Bitmap, используя BitmapFactory.decodeFile(). Функция возвращает null с перерывами.BitmapFactory.decodeFile возвращает null с перерывами

Если я обновляю фрагмент, изображения загружаются в растровое изображение должным образом. В основном я наблюдал это после первой загрузки, хотя это не последовало. В случае, если изображение уже загружено, иногда это наблюдается.

Вот код, я использую:

@Override 
    public void run() { 

     while (!downImageFile.exists()) { 

      try { 
       Thread.sleep(1000); // Waits for 1 second (1000 milliseconds) 
      } catch (InterruptedException e) { 
       Log.e(LOG_TAG, "Exception", e); 
      } 
     } 
     Log.v(LOG_TAG,"Image downloaded now "+downImageFile.getAbsolutePath()); 
     //String updateWords = updateAuto(); // make updateAuto() return a string 
     imageView.post(new Runnable() { 
      @Override 
      public void run() { 
        Bitmap bm = BitmapFactory.decodeFile(downImageFile.getAbsolutePath()); 
        if(bm==null){ 
         Log.v(LOG_TAG,"Buzz image is null. Size is "+downImageFile.length()+" "+downImageFile.getAbsolutePath()); 
        } 
        imageView.setImageBitmap(bm); 
       } 
       imageView.setVisibility(View.VISIBLE); 
     }); 
    } 

Вот соответствующие журналы:

11-08 01:32:41.290 32245-32245/com.halobee.main D/skia: --- decoder->decode returned false 
11-08 01:32:41.290 32245-32245/com.halobee.main V/BeaconCustomList: Buzz image is null. Size is 255458 /data/user/0/com.halobee.main/files/buzz/hbuzz_b251149098404ebeb1198a5ac03087af20161107110912.jpg 

Это не может быть OutOfMemory проблемой, так как нет таких журналов не печатаются и вопрос прерывистый. Я напечатал размер файла, чтобы подтвердить его существование, и это также действительное значение. Более того, проблема воспроизводится на некоторых устройствах, а не во всех. Я загружаю изображение в отдельный поток, а не в основной поток.

+0

Ум, этот 'while' цикл страшен. Просто потому, что файл * существует *, не означает, что файл * полностью написан *. Используйте шину событий или что-то, чтобы служба сообщила уровню пользовательского интерфейса, когда изображение загружено и полностью сохранено. – CommonsWare

+0

Эта строка 'while (! DownImageFile.exists())' проверяет, существует ли файл, есть ли гарантия, что все байты изображения были записаны в файл до того, как он сломает цикл while и попытается его декодировать? –

+0

Если это обрабатывается асинхронно, вам не нужно зацикливать, потому что блокирование не является проблемой, так как ваш не в основном потоке. –

ответ

0

1) Вы можете использовать библиотеку, чтобы помочь вам с этим вопросом, такими как волейбол, Picaso и многим другим андроид библиотек

2) Попробуйте скопировать пиксельные данные из растрового изображения в массив «INTArray», так как это может помогает справиться с большими файлами

// copy pixel data from the Bitmap into the 'intArray' array 
        bm.getPixels(intArray, 0, bm.getWidth(), 0, 0, bm.getWidth(), 
          bm.getHeight()); 
0

Я предлагаю вам использовать внешнюю библиотеку, как Glide или Picassa сделать изображение загрузки, кэширование и отображение. В любом случае, если вы решите не использовать одну из библиотек, я предлагаю вам создать прослушиватель в сетевом вызове или компонент, который получает изображение, и только затем выполнить часть декодирования после того, как вы передадите доступность файла в ваш фрагмент.

0

Может быть больше причин, по которым ваш битмап возвращает null. Во-первых, убедитесь, что вы предоставили разрешения WRITE_EXTERNAL_STORAGE и READ_EXTERNAL_STORAGE в своем манифесте, а также разрешения на доступ в Интернет. Также есть некоторые изменения от android 6 и выше (SDK 23). Попробуйте изменить целевой SDK в вашем build.gradle на 22.

+1

Если вы читаете OP «Если я обновляю фрагмент, изображения загружаются в растровое изображение правильно» - как это могло быть проблемой с разрешениями? –

+0

Я, конечно, дал разрешения. –

0
Bitmap.decodeFile(). 

Функция возвращает null прерывисто.

Он будет делать это на больших изображениях, где растровое изображение станет большим для доступной памяти.

Используйте уменьшенные изображения.

+0

Как я уже сказал, те же изображения загружаются после обновления. Так что это не проблема. –

+0

Почему бы и нет? Между тем GC может сделать больше свободной памяти. Попробуйте уменьшить изображения. – greenapps