IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Chargement Asynchrone d'image dans une liste


Sujet :

Android

  1. #1
    Invité
    Invité(e)
    Par défaut Chargement Asynchrone d'image dans une liste
    Bonjour,

    Voici donc le dernier gros problème qui me tarode depuis quelques jours :

    Voici l'adaptateur de ma liste comme il fonctionne actuellement. Il fonctionne bien MAIS il ralentit considérablement le défilement de ma liste.

    Ce que je souhaite c'est donc faire un chargement asynchrone ou via AsyncTask ou un thread basique. J'ai déjà regarder beaucoup de tutaux et autres sujet de forum mais je ne suis arrivé à rien de concluant.

    C'est pourquoi je vous sollicite de nouveau !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    public class AdaptateurListeNews extends BaseAdapter {
     
    	private ArrayList<String> images;
    	private ArrayList<String> titres;
    	private LayoutInflater monInflater;
     
    	public AdaptateurListeNews (Context context, ArrayList<String> _titres, ArrayList<String> _images){
    		this.monInflater = LayoutInflater.from(context);
    		this.images = _images;
    		this.titres = _titres;
    	}
     
    	@Override
    	public int getCount() {
    		return this.titres.size();
    	}
     
    	@Override
    	public Object getItem(int position) {
    		return this.titres.get(position);
    	}
     
    	@Override
    	public long getItemId(int position) {
    		return position;
    	}
     
    	public static class ViewHolder{
    		ImageView icon;
    		TextView text;
    	}
     
    	@Override
    	public View getView(int position, View convertView, ViewGroup parent) {
     
    		ViewHolder holder;
     
    		if(convertView == null){
    			convertView = monInflater.inflate(R.layout.liste_news, null);
    			holder = new ViewHolder();
    			holder.icon = (ImageView) convertView.findViewById(R.id.iconnews);
    			holder.text = (TextView) convertView.findViewById(R.id.textnews);
    			convertView.setTag(holder);
    		} else {
    			holder = (ViewHolder) convertView.getTag();
    		}
     
    		holder.text.setText(titres.get(position));
    		holder.icon.setImageDrawable(loadImageFromUrl(images.get(position)));
     
    		return convertView;
    	}
     
    	public static Drawable loadImageFromUrl(String url) {
    		InputStream inputStream;
    		try {
    			inputStream = new URL(url).openStream();
    		} catch (IOException e) {
    			throw new RuntimeException(e);
    		}
    		return Drawable.createFromStream(inputStream, "src");
    	}
    }
    Merci d'avance !

  2. #2
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    Salut,

    Premier type d'optimisation : réutiliser les images déjà téléchargées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
     
    public static Drawable loadImageFromUrl(String url) {
      if (listImages.contain(url)) {
        InputStream inputStream;
        try {
          inputStream = new URL(url).openStream();
        } catch (IOException e) {
          throw new RuntimeException(e);
        }
       Drawable dr = Drawable.createFromStream(inputStream, "src");
       listImages.put(url, dr);
       return dr;
      } else {
         return listImages.get(url);
      }
     
    }
     
    private static HashMap<String, Drawable> listImages = new HashMap<String, Drawable>();
    A partir de là, tu peux imaginer initialiser ce tableau dans une phase de chargement de ton application (via des threads ou autres mécanismes).

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonne idée qui effectivement me débarrasse du saccagement perpétuel de la fluidité de ma liste. Je regarde pour un préchargement de mes images.

    Petit bémol certaine image se trouvant dans le bas de la liste ne se télécharge pas car elle ne font pas parties de celle visible dans le cadre de la fenêtre.

    Une idée pour que toutes les images se télécharges avant l'affichage ?

  4. #4
    Membre du Club
    Profil pro
    Chef de projet Informatique
    Inscrit en
    Février 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chef de projet Informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 49
    Points : 50
    Points
    50
    Par défaut
    Moi à la création de la liste j'affecte une image temporaire pour chaque item. Cette image est une ressource dans les drawable. Le chargement est donc très rapide. Pour chaque item j'exécute en tâche de fond le chargement de mon image. Voilà une partie de mon code. Moi je charge l'image dans le cache pour éviter de la charger à nouveau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    private class DownloadImage extends AsyncTask<Article, Void, Integer> {
     
                    BitmapDrawable mBitmapDrawable = null;
     
                    protected Integer doInBackground(Article... article) {
     
                            if (! article[0].isDownloadImage())
                                    mBitmapDrawable =    Tools.downloadVignette(article[0].getImageUrl(), article[0].getId(), ArticleResumeView.this.getContext());
                                    article[0].setImageDrawable(mBitmapDrawable);
     
                                    if (mBitmapDrawable != null) {
                                            article[0].setDownloadImage(true);
                                            return 0;
                                    }
                                    else {
                                            article[0].setDownloadImage(false);
                                            return 1;
                                    }
     
                    }
     
                    protected void onPostExecute(Integer result) {
     
                            if (result == 0) {
     
                                    image.setImageDrawable(mBitmapDrawable);
                            }
     
     
     
                    }
     
            }

  5. #5
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    A partir de là, tu peux imaginer initialiser ce tableau dans une phase de chargement de ton application (via des threads ou autres mécanismes).

Discussions similaires

  1. Chargement asynchrone d'images d'une liste.
    Par Cuillere dans le forum Android
    Réponses: 2
    Dernier message: 23/07/2010, 15h25
  2. Insérer des images dans une liste de choix ?
    Par Strix dans le forum Balisage (X)HTML et validation W3C
    Réponses: 13
    Dernier message: 04/05/2007, 12h48
  3. Mettre des images dans une liste déroulante
    Par PrinceMaster77 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 01/12/2006, 15h35
  4. [VB.NET][ListView]des images dans une list view
    Par pcdj dans le forum Windows Forms
    Réponses: 1
    Dernier message: 16/12/2005, 12h08
  5. Réponses: 3
    Dernier message: 02/07/2004, 13h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo