2016-10-20 8 views
0

Я показываю почти 4000 изображений в цикле с именем изображения.Resources.NotFoundException бросается при загрузке многих изображений в цикле

Вот код, который я использую, чтобы получить мои изображения из растяжимой папки

 for(int i=0; i<count(images_array); i++) { 
      mDrawableName = images_array(i); 

      int resID = res.getIdentifier(mDrawableName, "drawable", activity.getPackageName()); 
      Drawable drawable = res.getDrawable(resID); 
      image.setImageDrawable(drawable); 
    } 

вопросы являются:

  1. Если имя изображения не найден в папке ресурсов мое приложение бросает меня исключение и сбои.
  2. Есть ли лучший способ загрузить 4000 изображений с возможностью рисования в listview? Есть ли способ, который я могу проверить, если изображение не в drawable , а затем показать изображение заполнителя?
+0

Я не вижу здесь проблемы ... вы получаете исключение, потому что ресурс не существует. Поймай исключение и сделай то, что хочешь в этом случае. Лучший способ ... не загружать 4000 изображений? Если они не сделают 10пикселей, вы не сможете показать их все один раз, поэтому постарайтесь загрузить только то, что вам нужно. – AxelH

ответ

1

Если имя изображения не найдено в папке ресурсов моего приложения через меня исключения и зависание.

Это не проблема, так как предполагается, что поведение getIdentifier возвращает 0 для несуществующего ресурса, а затем getDrawable бросает Resources.NotFoundException для id = 0 (который не является допустимым ID).

Есть ли способ проверить, является ли изображение мотивом в виде рисунка, а затем показать изображение заполнителя?

Вы либо поймать это исключение или проверить, если getIdentifier возвращается 0.
я не знаю остальную часть вашего кода, так что на основе того, что вы в курсе, вы можете сделать это:

for (int i=0; i<count(images_array); i++) { 
    mDrawableName = images_array(i); 

    int resID = res.getIdentifier(mDrawableName, "drawable", activity.getPackageName()); 
    Drawable drawable; 
    if (resID == 0) { 
     drawable = res.getDrawable(R.drawable.placeholderimage, null); 
    } else { 
     drawable = res.getDrawable(resID); 
    } 
    image.setImageDrawable(drawable); 
} 

Примечание:
getDrawable(int id) теперь устарел, начиная API 22.
В примере кода вместо этого я использовал getDrawable(int id, Resources.Theme theme).
Возможно, вы захотите проверить другой alternatives.

Есть ли лучший способ загрузить 4000 изображений из списка в списке?

Попробуйте использовать Android RecyclerView и/или сторонние библиотеки, такие как Glide.

+0

Лучше обрабатывать Resource.NotFoundException вместо этого для проверки самого объекта. Я просто отвечаю на свой вопрос. –

+1

Я бы предложил проверить ID, это слишком много исключений будет стоить времени, особенно для (4000 попыток) – AxelH

0
Boolean fileFound = true; 
     try{ 
      int resID = res.getIdentifier(mDrawableName , "drawable", activity.getPackageName()); 
      Drawable drawable = res.getDrawable(resID); 
      image.setImageDrawable(drawable); 
     }catch (Resources.NotFoundException e){ 
       fileFound = false; 
     } 
     if(!fileFound){ 
      int resID = res.getIdentifier("img_not_found" , "drawable", activity.getPackageName()); 
      Drawable drawable = res.getDrawable(resID); 
      image.setImageDrawable(drawable); 
     } 
+0

что случилось с полным ответом @ginomempin? 'Вы либо поймаете это исключение, либо проверите, вернул ли getIdentifier 0'. Кстати, исключение - это тяжелый процесс. Таким образом, эти методы сильно замедлят процесс – AxelH

+0

Я просто отвечаю на свой вопрос. Этот код работает как очарование для меня. –

+1

Но почему вы ответили самим, если кто-то уже это сделал, и с более подробными объяснениями? Для следующих пользователей это лучше иметь объяснение ... Просто примите его ответы, поскольку это явно то, что вы сделали. – AxelH