Загрузка Picasso изображения, созданного внутри AsyncTask

Поэтому я пытаюсь использовать библиотеку Picasso для загрузки и кеширования изображений. Чтобы связаться с нами, чтобы перейти к Picasso мне нужно сделать запрос к Content Provider контактов. Поскольку я не хочу блокировать основной stream пользовательского интерфейса, чтобы получить contactId, я поместил его в AsyncTask . И как только я получаю это contactId, я делаю вызов Picasso в onPostExecute() AsyncTask .

Тем не менее, я замечаю мерцание, которое появляется, когда я быстро просматриваю свой ListView . Мне кажется, что есть проблема с ViewHolder поскольку переработанные представления отображают предыдущее изображение перед установкой соответствующего изображения. Есть ли вообще избежать этого?

 public class ConversationThreadsCursorAdapter extends SimpleCursorAdapter { // region Constants private static final int RECIPIENT_IDS_COLUMN_INDEX = 3; private static final int ID2_COLUMN_INDEX = 0; private static final int ADDRESS_COLUMN_INDEX = 1; // endregion // region Variables private final String DEBUG_TAG = getClass().getSimpleName().toString(); private Context mContext; protected Drawable mDefaultPicDrawable; protected ContentResolver mContentResolver; protected LinearLayout.LayoutParams mContactPicLayoutParams; // endregion // region Constructors public ConversationThreadsCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) { super(context, layout, c, from, to, flags); mContext = context; mDefaultPicDrawable = mContext.getResources().getDrawable( R.drawable.ic_contact_picture); mContactPicLayoutParams = new LinearLayout.LayoutParams( mDefaultPicDrawable.getIntrinsicWidth(), mDefaultPicDrawable.getIntrinsicHeight()); } // endregion public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null; if (convertView == null) { convertView = mLayoutInflater.inflate(R.layout.simple_message, null); // Creates a ViewHolder and store references to the children // views we want to bind data to. viewHolder = setupViewHolder(convertView); convertView.setTag(viewHolder); } else { // Get the ViewHolder back to get fast access to the TextView // and the ImageView. viewHolder = (ViewHolder) convertView.getTag(); viewHolder.task.cancel(true); } mCursor = getCursor(); mCursor.moveToPosition(position); viewHolder.position = position; String recipient_ids = mCursor.getString(RECIPIENT_IDS_COLUMN_INDEX); String[] recipients = recipient_ids.split(" "); viewHolder.task = new AddressFetcherTask(viewHolder, position); viewHolder.task.execute(recipients); return convertView; } // region Helper Methods private ViewHolder bindUIElements(View convertView) { ViewHolder viewHolder = new ViewHolder(); viewHolder.contactBadge = (QuickContactBadge) convertView.findViewById(R.id.contact_pic); return viewHolder; } private ViewHolder setupViewHolder(View convertView) { ViewHolder viewHolder = bindUIElements(convertView); viewHolder.contactBadge.setLayoutParams(mContactPicLayoutParams); return viewHolder; } // endregion // region Inner Classes private class ViewHolder { QuickContactBadge contactBadge; int position; } private class AddressFetcherTask extends AsyncTask  { private ViewHolder mViewHolder; private int mPosition; public AddressFetcherTask(ViewHolder viewHolder, int position) { mViewHolder = viewHolder; mPosition = position; } @Override protected Integer doInBackground(String[]...recipients) { String recipient = recipients[0][0]; Log.d(DEBUG_TAG, "recipient is " + recipient); Cursor c = mContentResolver.query( Uri.parse("content://mms-sms/canonical-addresses"), null, "_id = " + recipient, null, null); String _id = ""; String address = ""; while (c.moveToNext()) { _id = c.getString(ID2_COLUMN_INDEX); address = c.getString(ADDRESS_COLUMN_INDEX); } c.close(); int contactId; if (address != null) { contactId = ContactsUtils.getContactId(mContext, address, "address"); } else { contactId = Integer.valueOf(address); } return contactId; } @Override protected void onPostExecute(Integer contactId) { if (mViewHolder.position == mPosition) { Picasso.with(mContext) .load(getContactUri(contactId)) .placeholder(R.drawable.ic_contact_picture) .into(mViewHolder.contactBadge); } } } // endregion } 

Просто установите для изображения в значение null в пределах getView и он должен удалить то, что вы испытываете по большей части, вы будете правы.

Другой крошечный крошечный кроссовый аспект заключается в том, что когда ваша асинтеза придет в postExecute, вид может все еще существовать, но ему может быть назначен другой контакт для загрузки (он был переработан).

Вам нужно поместить какой-то тэг в зритель, а затем проверить, что он все тот же, когда вы идете установить его в postexecute.

Чтобы удалить затухание, вам нужно удалить асинтексу из getview. Вы должны иметь возможность вызвать picasso в пределах getview, что означает, что ваши данные готовы до прибытия в getview.

Ниже, не совсем уверен, что он скомпилируется, я сделал это в текстовом редакторе.

Но басистом я кэширую результаты в mCachedContactIds и просто перезаряжаю всю таблицу, если мне нужен новый. Обычно я считаю это надежным. Но вы также можете назвать код picasso, который я закомментировал

 public class ConversationThreadsCursorAdapter extends SimpleCursorAdapter { // region Constants private static final int RECIPIENT_IDS_COLUMN_INDEX = 3; private static final int ID2_COLUMN_INDEX = 0; private static final int ADDRESS_COLUMN_INDEX = 1; private HashMap mCachedContactIds = new HashMap(); // endregion // region Variables private final String DEBUG_TAG = getClass().getSimpleName().toString(); private Context mContext; protected Drawable mDefaultPicDrawable; protected ContentResolver mContentResolver; protected LinearLayout.LayoutParams mContactPicLayoutParams; // endregion // region Constructors public ConversationThreadsCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) { super(context, layout, c, from, to, flags); mContext = context; mDefaultPicDrawable = mContext.getResources().getDrawable( R.drawable.ic_contact_picture); mContactPicLayoutParams = new LinearLayout.LayoutParams( mDefaultPicDrawable.getIntrinsicWidth(), mDefaultPicDrawable.getIntrinsicHeight()); } // endregion public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null; if (convertView == null) { convertView = mLayoutInflater.inflate(R.layout.simple_message, null); // Creates a ViewHolder and store references to the children // views we want to bind data to. viewHolder = setupViewHolder(convertView); convertView.setTag(viewHolder); } else { // Get the ViewHolder back to get fast access to the TextView // and the ImageView. viewHolder = (ViewHolder) convertView.getTag(); viewHolder.task.cancel(true); viewHolder.contactBadge.setImageDrawable(mDefaultPicDrawable); } mCursor = getCursor(); mCursor.moveToPosition(position); viewHolder.position = position; String recipient_ids = mCursor.getString(RECIPIENT_IDS_COLUMN_INDEX); String[] recipients = recipient_ids.split(" "); String recipient = recipients[0]; if(mCachedContactIds.get(recipient) != null){ Picasso.with(mContext) .load(getContactUri(mCachedContactIds.get(recipient))) .placeholder(R.drawable.ic_contact_picture) .into(mViewHolder.contactBadge); } else { viewHolder.task = new AddressFetcherTask(viewHolder, position); viewHolder.task.execute(recipients); } return convertView; } // region Helper Methods private ViewHolder bindUIElements(View convertView) { ViewHolder viewHolder = new ViewHolder(); viewHolder.contactBadge = (QuickContactBadge) convertView.findViewById(R.id.contact_pic); return viewHolder; } private ViewHolder setupViewHolder(View convertView) { ViewHolder viewHolder = bindUIElements(convertView); viewHolder.contactBadge.setLayoutParams(mContactPicLayoutParams); return viewHolder; } // endregion // region Inner Classes private class ViewHolder { QuickContactBadge contactBadge; int position; AddressFetcherTask task; } private class AddressFetcherTask extends AsyncTask < String[], Void, Integer > { private ViewHolder mViewHolder; private int mPosition; private String mRecipient; public AddressFetcherTask(ViewHolder viewHolder, int position) { mViewHolder = viewHolder; mPosition = position; } @Override protected Integer doInBackground(String[]...recipients) { mRecipient = recipients[0][0]; Log.d(DEBUG_TAG, "recipient is " + recipient); Cursor c = mContentResolver.query( Uri.parse("content://mms-sms/canonical-addresses"), null, "_id = " + mRecipient, null, null); String _id = ""; String address = ""; while (c.moveToNext()) { _id = c.getString(ID2_COLUMN_INDEX); address = c.getString(ADDRESS_COLUMN_INDEX); } c.close(); int contactId; if (address != null) { contactId = ContactsUtils.getContactId(mContext, address, "address"); } else { contactId = Integer.valueOf(address); } return contactId; } @Override protected void onPostExecute(Integer contactId) { if (mViewHolder.position == mPosition) { mCachedContactIds.put(mRecipient, contactId); Picasso.with(mContext) .load(getContactUri(mCachedContactIds.get(recipient))) .placeholder(R.drawable.ic_contact_picture) .into(mViewHolder.contactBadge); } } } // endregion } 

Или, если все, что вас беспокоит, это исчезновение от пикассо, а затем добавьте noFade () в запрос.

  • изображение перемещается по hover - проблема непрозрачности хрома
  • Как я могу создать эффект щелчка изображения, как кнопка на Android?
  • Как сохранить изображение в галерее Android
  • как сохранить изображение как blob в Sqlite и как его получить?
  • Преобразовать System.Windows.Media.ImageSource в System.Drawing.Bitmap
  • Как программно сохранить изображение с URL-адреса?
  • Как повернуть изображение в WinForms
  • Как получить правильную ориентацию изображения, выбранного из галереи изображений по умолчанию
  • Как захватить UIView в UIImage без потери качества на дисплее сетчатки
  • Сохранение изображений: файлы или капли?
  • Как получить фактическую ширину и высоту изображения с помощью jQuery?
  • Interesting Posts

    Почему я неожиданно получаю сообщение «Заблокированная загрузка смешанного активного контента» в Firefox?

    Горячая замена в Spring Boot

    Самый длинный ациклический путь в направленном невзвешенном графике

    Можно ли автоматически отключать отдельные мониторы, когда они не используются?

    Время с момента последней разблокировки Windows 7

    Могу ли я увеличить лимит оперативной памяти Windows XP 32bit на 3,5 ГБ с помощью / PAE?

    Пример нелинейного, неагрессивного и недетерминированного CFL?

    Как редактировать файл hosts в Windows 8? Защитник говорит, что обнаружено вредоносное ПО

    Какова мотивация приведения символов в ES6?

    Вычисление всех подмножеств набора чисел

    Когда я обновляю свой сайт, я получаю 404. Это с Angular2 и firebase

    Android – Получение звука для воспроизведения через динамик

    Отмена длительного процесса в VB6.0 без DoEvents?

    Добавить изображение в JAR Java

    Преобразование строки в цвет в Java

    Давайте будем гением компьютера.