Caricamento Picasso di immagini riprodotte all'interno di AsyncTask

Quindi cerco di utilizzare la Biblioteca Picasso per il download di immagini e la memorizzazione nella cache. Per get il contactUri da passare a Picasso devo fare una domanda al Content Provider Contenitore Content Provider . Dal momento che non voglio bloccare il thread UI principale per get il contatto, ho inserito questo in un AsyncTask . E una volta che ottengo quel contatto, faccio la chiamata a Picasso nel metodo onPostExecute() AsyncTask .

Tuttavia, sto notando un tremolio che si presenta quando scorri rapidamente il mio ListView . Mi sembra che esista un problema con il ViewHolder poiché le viste riciclate stanno visualizzando l'image precedente prima di impostare l'image appropriata. C'è però per evitare questo?

  • ANDROID: Come faccio a scaricare un file video sulla scheda SD?
  • Come cambiare `color solido` dal codice?
  • Forza un'attività di Android per utilizzare sempre la modalità orizzontale
  • È obbligatorio salvare i file * .iml in Controllo versione?
  • Miglioramento delle performance di Google Maps
  • Cordova build: Installare Android Target: "android-22". Non voglio android-22. Voglio android-19 - cosa faccio?
  •  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 < String[], Void, Integer > { 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 } 

  • SwipeListener su ListView e ClickListener sugli elementi di ListView
  • Il metodo SetError di TextInputLayout lancia ClassCastException in 24.2.0
  • Come convertire la string in condizione booleana in java / android?
  • Android: triggersre il colore del text di ToggleButton
  • Denial di authorization di Android 6.0: richiede l'authorization android.permission.WRITE_SETTINGS
  • Android: AppWidget con visualizzazione personalizzata non funzionante
  • One Solution collect form web for “Caricamento Picasso di immagini riprodotte all'interno di AsyncTask”

    Basta impostare l'image in null all'interno di getView e dovrebbe rimuovere ciò che si sta verificando per la maggior parte si avrà ragione.

    L'altro aspetto minuscolo di casella angular è che quando la tua asynctask arriva a postExecute, la vista potrebbe ancora esistere, ma potrebbe essere stato già assegnato un altro contatto per caricare (è stato riciclato).

    Devi mettere un certo tipo di tag nel visualizzatore e quindi controllare che sia ancora lo stesso quando si va a posizionarlo in postexecute.

    Per rimuovere la dissolvenza, è necessario rimuovere l'asynctask dal getview. Devi essere in grado di call picasso all'interno di getview, il che significa avere i tuoi dati pronti prima di arrivare a getview.

    Di seguito, non certo se compilerà, l'ho fatto in un editor di text.

    Ma bassicamente sto caching i risultati in mCachedContactIds e solo ricaricare l'integer tavolo se ho bisogno di un nuovo. Di solito ho trovato che questo sia robusto. Ma puoi anche call il codice picasso che ho commentato

     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<String, Integer> mCachedContactIds = new HashMap<String, Integer>(); // 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 } 

    O se tutto quello che ti stai leggendo è la dissolvenza da picasso, quindi aggiungi noFade () alla richiesta.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.