Question

Je l'ai revu quelques messages au sujet de chargement paresseux, mais je crois que mon problème est un autre bit.

J'ai une galerie (ma classe étend Galerie) qui affiche 20 images assez grand en taille (400-500K chacun). Je ne peux pas les charger à la galerie depuis que je reçois une exception OutOfMemory.
Donc, je créé un tableau de 20 dessinables et initialement peuplé les 9 premiers éléments (les images proviennent du Web) et réglez tout le reste à zéro. Mon intention était le suivant: une passade à droite, élément pas chercher. 10 et fixé à l'élément de null no. 0. Sur un autre à l'élément jeter chercher à droite pas. 11 et fixé à l'élément de null no. 1 à null. Même logique sur une passade gauche.

Le problème est que je peux jeter beaucoup plus rapide que les éléments sont récupérés. Ma galerie a une BaseAdapter et son getView () ressemble à quelque chose comme ceci:

public View getView(int position, View  convertView, ViewGroup  parent){
     ImageView imageView = new ImageView();
     imageView.setDrawable(imageArray[position];
     ....
     ....

     return imageView;
}

Comment puis-je dire getView () - si imageArray [position] est toujours nulle, montrer un « chargement ... » dialogue et une fois qu'il est répétition ensemble vous-même avec la même position
? Je ne veux pas voir le imageView vide puis mis à la volée. Je veux pas être en mesure de voir le imageView du tout jusqu'à ce qu'elle soit.

Merci.

Était-ce utile?

La solution

Galerie est conçu pour une expérience lisse. Il sera très mauvaise interface utilisateur si vous bloquer l'écran et ne pas passer à l'image suivante jusqu'à ce qu'il soit tiré par les cheveux. Cet utilisateur de façon ne sera pas en mesure de jeter du tout. Vous devez afficher un indicateur de chargement au lieu de l'image pendant le chargement.

Je pense que votre scénario est assez commun. Vous devez télécharger les images et les afficher. Si vous obtenez OutOfMemory vous pouvez essayer d'images supersample étrange de problème de mémoire alors que charger une image à un objet Bitmap .

S'il y a encore OutOfMemory vous devez supprimer bitmaps de la mémoire et de les mettre en cache en SD. Alors, quand flings utilisateur retour vous pouvez charger à nouveau les images de SD, il sera assez rapide. Et la consommation de mémoire sera plus faible. Comme vous le suggérez, vous pouvez avoir 10 Images les plus récentes mises en cache en mémoire et d'autres mises en cache sur SD.

Vous pouvez jeter un oeil à mon exemple de code charge Lazy d'images ListView. En fait, il est un adaptateur ListView mais vous pouvez l'appliquer à la galerie avec des modifications mineures. Je pense qu'il va faire exactement ce dont vous avez besoin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top