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 :

Problème dans l'affichage d'une image


Sujet :

Android

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 164
    Points : 159
    Points
    159
    Par défaut Problème dans l'affichage d'une image
    Bonjour,

    j'ai un problème, c'est quand je clique sur un ligne de ma liste et passé à 2éme page pour afficher les détails un message d'erreur s'affiche, le problème est dans l'image
    que je dois changer

    code
    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
    65
    66
    67
    68
     
    package com.weblogy.abidjan;
     
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.NodeList;
     
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.widget.ImageView;
    import android.widget.ListView;
    import android.widget.TextView;
     
    public class DetailMainActivity extends Activity {
     
    	// All static variables
    	static final String URL = "http://news.abidjan.net/apps/iphone/une.xml";
    	// XML node keys
    	static final String KEY_ITEM = "item"; // parent node
    	static final String KEY_TITLE = "title";
    	static final String KEY_AUTHOR = "author";
    	static final String KEY_DESC = "description";
    	static final String KEY_PHOTO = "photo";
    	static final String KEY_PUBDATE = "pubDate";
    	public ImageLoader imageLoader; 
    	ListView list;
        LazyAdapter adapter;
     
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		// TODO Auto-generated method stub
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.pagedetail);
    		// getting intent data
            Intent in = getIntent();
            // Get XML values from previous intent
            String title = in.getStringExtra(KEY_TITLE);
     
     
            TextView authorDetail = (TextView) findViewById(R.id.authorDetail);
            TextView titleDetail = (TextView) findViewById(R.id.titleDetail);
            TextView pubDateDetail = (TextView) findViewById(R.id.pubdateDetail);
            TextView descDetail = (TextView) findViewById(R.id.descDetail);
            ImageView photoDetail=(ImageView)findViewById(R.id.photoDetail); // thumb image
    //        Toast.makeText(this, photoDetail.toString(), Toast.LENGTH_LONG).show();
    		XMLParser parser = new XMLParser();
    		String xml = parser.getXmlFromUrl(URL); // getting XML from URL
    		Document doc = parser.getDomElement(xml);
     
    		NodeList nl = doc.getElementsByTagName(KEY_ITEM);
    		for (int i = 0; i < nl.getLength(); i++) {
    			// creating new HashMap
    			Element e = (Element) nl.item(i);
    		if(title.equals(parser.getValue(e, KEY_TITLE))){
    				titleDetail.setText(parser.getValue(e, KEY_TITLE));
    				descDetail.setText(parser.getValue(e, KEY_DESC));
    				authorDetail.setText(parser.getValue(e, KEY_AUTHOR));
    				pubDateDetail.setText(parser.getValue(e, KEY_PUBDATE));
    				imageLoader.DisplayImage(parser.getValue(e, KEY_PHOTO), photoDetail);
    //				Toast.makeText(this, parser.getValue(e, KEY_PHOTO), Toast.LENGTH_LONG).show();
    //				Toast.makeText(this, (CharSequence) photoDetail, Toast.LENGTH_LONG).show();    
    			}
    		}
     
    //	
    	}
    }
    Log cat
    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
     
    01-27 19:32:30.453: E/AndroidRuntime(367): FATAL EXCEPTION: main
    01-27 19:32:30.453: E/AndroidRuntime(367): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.weblogy.abidjan/com.weblogy.abidjan.DetailMainActivity}: java.lang.NullPointerException
    01-27 19:32:30.453: E/AndroidRuntime(367): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
    01-27 19:32:30.453: E/AndroidRuntime(367): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
    01-27 19:32:30.453: E/AndroidRuntime(367): 	at android.app.ActivityThread.access$2300(ActivityThread.java:125)
    01-27 19:32:30.453: E/AndroidRuntime(367): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
    01-27 19:32:30.453: E/AndroidRuntime(367): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    01-27 19:32:30.453: E/AndroidRuntime(367): 	at android.os.Looper.loop(Looper.java:123)
    01-27 19:32:30.453: E/AndroidRuntime(367): 	at android.app.ActivityThread.main(ActivityThread.java:4627)
    01-27 19:32:30.453: E/AndroidRuntime(367): 	at java.lang.reflect.Method.invokeNative(Native Method)
    01-27 19:32:30.453: E/AndroidRuntime(367): 	at java.lang.reflect.Method.invoke(Method.java:521)
    01-27 19:32:30.453: E/AndroidRuntime(367): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    01-27 19:32:30.453: E/AndroidRuntime(367): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    01-27 19:32:30.453: E/AndroidRuntime(367): 	at dalvik.system.NativeStart.main(Native Method)
    01-27 19:32:30.453: E/AndroidRuntime(367): Caused by: java.lang.NullPointerException
    01-27 19:32:30.453: E/AndroidRuntime(367): 	at com.weblogy.abidjan.DetailMainActivity.onCreate(DetailMainActivity.java:61)
    01-27 19:32:30.453: E/AndroidRuntime(367): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    01-27 19:32:30.453: E/AndroidRuntime(367): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
    01-27 19:32:30.453: E/AndroidRuntime(367): 	... 11 more
    Merci pour votre aide

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Ben c'est assez simple... utilisation d'une fonction sur un objet null...

    Comme la ligne 61 ne correspond à rien dans le code que tu as collé, tout ce que je peux dire c'est que ligne 61 de DetailMainActivity.java


    Problème 2: Récupération de XML depuis une URL (donc à priori Internet) dans une fonction du framework UI. Cela a toujours été (et sera toujours) INTERDIT. Utiliser des AsyncTask ou des Thread pour effectuer des opérations potentiellement longues.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 164
    Points : 159
    Points
    159
    Par défaut
    merci nicroman
    c'est dans la ligne 60
    j'ai voulu utilisé le thread comme tu m'as proposé
    je vois que c'est erroné, comment je peux mettre un thread pour que mon image s'affiche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    new Thread(new Runnable() {
     
    					@Override
    					public void run() {
    						// TODO Auto-generated method stub
    						imageLoader.DisplayImage(parser.getValue(e, KEY_PHOTO), photoDetail);
    					}
    				});

  4. #4
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Le thread n'est pas pour l'affichage de l'image (bien que si il vienne d'une URL il faille le faire dans un thread aussi) mais pour la récupération du XML.
    (donc à partir de la ligne 48)

    Pour le problème initial, l'exception veut dire simplement que "imageLoader" est null...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  5. #5
    Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2011
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 48
    Points : 40
    Points
    40
    Par défaut
    voila une méthode j’espère que vous aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ImageView photo =(ImageView) v.findViewById(R.id.photo);
     
                Drawable drawable = LoadImageFromWebOperations(o.getPhoto());
                photo.setImageDrawable(drawable);
    et puis ajouter cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private Drawable LoadImageFromWebOperations(String url)
        {
        try
        {
        InputStream is = (InputStream) new URL(url).getContent();
        Drawable d = Drawable.createFromStream(is, "src name");
        return d;
        }catch (Exception e) {
        System.out.println("Exc="+e);
        return null;
        }
         }

  6. #6
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut

    Ce code ne marche pas du tout:

    Commençons par le principal, la gestion des erreurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    } catch (Exception e) {
       System.out.println("Exc="+e);
       return null;
    }
    1. On renvoit "null", ce qui veut dire que *tous les appels à cette fonction devront vérifier le résultat*..
    2. Le System.out.println est pas bon du tout du tout (perte de l'exception).

    Ensuite le début:
    "LoadImageFromWebOperations" désolé, mais une fonction commence obligatoirement par une minuscule en Java.

    Et pour finir le concept:
    Il est INTERDIT de faire des appels lents pendant le thread UI. Et Comme il est interdit de faire des appels UI (par exemple setImageDrawable) hors du thread UI, cela ne peut pas clairement pas fonctionner comme cela.

    Voici un exemple de code adapté:
    Pendant le "main" thread, on a besoin de charger l'image "url" dans l'image view "imageView":
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ImageView imageView = findViewById(R.id.photo);
    URL url = o.getPhoto();
    ImageLoader loader = new ImageLoader(imageView ,url);
    loader.execute();
    Et le code suivant dans un "ImageLoader.java"
    Code java : 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
     
    public class ImageLoader extends AsyncTask<Void,Void,Drawable>
    {
        private WeakReference<ImageView> imageView;
        private URL imageUrl;
     
        public ImageLoader(ImageView view, URL url)
        {
            this.imageView = new WeakReference<ImageView>(view);
            this.imageUrl = url;
        }
     
        @Override
        public Drawable doInBackground(Void ... params)
        {
            Drawable ret = null;
            InputStream is = null;
            try {
                is = this.imageUrl.openConnection().getInputStream();
                ret = Drawable.createFromStream(is, null);
            } catch (Exception ex) {
                Log.e("ImageLoader","Failed to load image",ex);
            } finally {
                if (is != null) try { is.close(); } catch (Exception ex) { Log.wtf("ImageLoader","Failed to gracefully close URL stream",ex); }
            }
            return ret;
        }
     
        @Override
        public void onPostExecute(Drawable d)
        {
            ImageView iv = this.imageView.get();
            if (iv != null) {
                if (d == null)
                    d = iv.getContext().getResources().getDrawable(R.drawable.errorImage);
                iv.setImageDrawable(d);
            }
        }
    }

    J'ai nommé l'async task "Loader" pour une bonne raison: on pourrait tout à fait passer par les "loaders" de Android 3+ (si ils sont disponibles) en lieu et place d'un AsyncTask "classique".

    Il y a bien entendu des optimisations à effectuer: cache local des images ainsi récupérées, en cas de plusieurs "loadings", les effectuer en "batch" (particulièrement si les URLs viennent du même serveur) pour economiser la batterie, etc...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

Discussions similaires

  1. Problème dans l'affichage de mon image
    Par ghanouche2408 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 07/04/2014, 17h22
  2. Prolème dans l'affichage d'une image d'un hyperlink
    Par Wnejla dans le forum SharePoint
    Réponses: 2
    Dernier message: 18/03/2013, 13h01
  3. Réponses: 1
    Dernier message: 25/11/2011, 13h38
  4. probléme dans l'affichage d'une fenétre
    Par saraenim dans le forum Windows Forms
    Réponses: 4
    Dernier message: 22/04/2008, 17h24
  5. Problème d'affichage d'une image dans une fenetre
    Par taouja dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 30/04/2007, 17h00

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