2016-04-11 1 views
0

У меня есть viewHolder, который загружает изображение с помощью Picasso. DB вернет путь к URL как String. Таким образом, у меня есть мой код, как показано ниже (с использованием Kotlin)Picasso не терпит пустой URL-адрес строки?

Picasso.with(context).load(url).error(placeholder).transform(transformation) 
      .placeholder(placeholder).into(this) 

Он загружается нормально. Однако иногда URL-адрес пуст. Я ожидаю, что вместо этого он загрузит местозаполнитель. Но крах, как ниже

java.lang.IllegalArgumentException: Path must not be empty. 
    at com.squareup.picasso.Picasso.load(Picasso.java:297) 

Это заставит меня явно делать чек, который не является идеальным

if (url == null || url.isEmpty()) { 
    Picasso.with(context).load(placeholder).transform(transformation).into(this) 
} else { 
    Picasso.with(context).load(url).error(placeholder).transform(transformation) 
      .placeholder(placeholder).into(this) 
} 

Это ожидается, что Пикассо будет врезаться, когда URL Строка пуста вместо загрузки заполнитель?

+0

Да, это было бы много накладных расходов (относительно), чтобы загрузить Пикассо за пустой строка. – zgc7009

+0

Не будет ли picasso внутренне, где, если строка пуста или URL недоступен, он должен отступить к «ошибке» или «помещению» изображения? – Elye

+0

Это могло бы быть, но иногда библиотекам просто легче предположить, что вы будете использовать соответствующие значения, чем делать проверки везде где-то somemimessometimes. Понимает определенную ответственность за пользователя. – zgc7009

ответ

1

javadoc for Picasso.load() явно заявляет, что он выдает исключение IllegalArgumentException, когда URL-адрес пуст или пустой. Вот что вы можете ожидать.

+0

Спасибо. Факты жизни. Я мог бы добавить Try-Catch, чтобы справиться с этим на моем конце. – Elye

+0

Это будет более эффективным и удобочитаемым, если вы просто проверите на пустое или нулевое действие и предпримите соответствующие действия. Это очень распространенная вещь в java. –

+0

Прохладный. Как то, что я делал выше. Просто подумал, что есть некоторые другие ошибки, которые я могу пропустить ... так как я не полностью контролирую БД, это могут быть другие вещи, которые могут вызвать Пикассо для исключения. p/s: В моей программе, если вход недействителен, я проигнорирую его и покажу изображение заполнителя. ... Кстати, мне нравится ваш блог Kotlin. Прохладный пост! – Elye

1

я надеюсь помочь вам ...

if (item.getImagen().isEmpty()) { //url.isEmpty() 
     Picasso.with(mContext) 
       .load(R.drawable.placeholder) 
       .placeholder(R.drawable.placeholder) 
       .error(R.drawable.placeholder) 
       .into(holder.imageView); 

    }else{ 
     Picasso.with(mContext) 
       .load(item.getImagen()) 
       .placeholder(R.drawable.placeholder) 
       .error(R.drawable.placeholder) 
       .into(holder.imageView); //this is your ImageView 
    } 
+0

Старайтесь не публиковать ответы, которые состоят исключительно из кода.Несколько строк объяснения дают ответы, подобные этому, намного легче понять с первого взгляда и гораздо более подверженному признанию/принятию. –

+0

Его безопаснее использовать TextUtils.IsEmpty (str), затем str.IsEmpty(), поскольку он проверяет значение null, а не бросает исключение, если str равно null – TWI

0

Я предлагаю вам проверить строку перед загрузкой в ​​Пикассо.

public static boolean isBlank(String string) { 
    return TextUtils.isEmpty(string.trim()); 
} 
0

Это может быть слишком поздно, но я столкнулся с этой ошибкой сегодня, и после того, как прочитал в документации Picasso#load методы говорится, что передача пустой или пустой строки вызовет метод бросить IllegalArgumentException и передавая нуль не будет сгенерировано исключением но триггер RequestCreator#error, который будет загружать изображение ошибки, если он указан иначе, цель не будет отображать ничего.

если вы не имеете никакого контроля над URL изображения (скажем, его приход с сервера), вы можете попробовать следующее:

mPicasso.load(photo.isEmpty() ? null : photo) 
       .placeholder(placeholder) 
       .error(error_placeholder) 
       .into(target); 
Смежные вопросы