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

Java Discussion :

Exception sur HTTPGet


Sujet :

Java

  1. #1
    Membre averti Avatar de Fooshi
    Homme Profil pro
    ICD
    Inscrit en
    Juin 2002
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ICD
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 507
    Points : 359
    Points
    359
    Par défaut Exception sur HTTPGet
    Bonjour,
    Sur une application Android, j'ai une fonction de téléchargement d'image qui me renvoie une exception :

    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
    public Bitmap DownloadImage(String url) {
    		Bitmap bitmap = null;
    		InputStream is = null;
    		try
    		{
    		HttpClient client = new DefaultHttpClient();
    		HttpGet httpMethod = new HttpGet(url);
     
    		HttpResponse response = client.execute(httpMethod);
    		is = response.getEntity().getContent();
     
    		}catch (Exception e) {
    			return null;
    		}
     
    		String result = "";
    		try {
    			bitmap = BitmapFactory.decodeStream(is);
    			is.close();
    		} catch (Exception e1) {
    			return null;
    		}
    		return bitmap;
    	}
    elle est appelée comme ceci dans une activity :

    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
    public void setHeadBand(ParentMapControllerActivity mca, Agency item) {
    		this.setVisibility(VISIBLE);
    		headBand.setText(item.getTitle());
     
    		TV_Adresse.setText(item.getSnippet());
     
    		TV_Nomcritere.setText(item.getMailString());
     
    		ImageResizer.downloadImage(mca, item.getLogo(), image);
     
    	    TV_next.setVisibility(GONE);
    	    setClickListener(new OnClickListener() {
    			public void onClick(View v) {
    			}
    		});
    	}
    Ca fonctionne très bien sur Android 2 mais pas sur Android 4.
    La methode donwloadimage est appelée différemment dans le programme plusieurs fois et ça fonctionne mais pas ici dans cette méthode "setheadband" .
    Je debute sur java et je ne voie pas trop le problème, merci d'avance !

  2. #2
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    100 balles que ton exception est une "NetworkOnMainThreadException" (merci de fournir l'exception et le stacktrace complet ).
    Enfin ... vu la gestion d'exception, tu ne dois pas en avoir x)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    catch (Exception e) {
    			return null;
    		}
    Ne pas écrire ceci ! Au minimum, log ton exception quelque part si ce n'est pas dans le LogCat.
    En général, on les log ainsi Log.e(UN_TAG, UN_MESSAGE, e);Je ta rassure, ça ne fonctionne plus à partir de HoneyComb (Android 3). Faire un traitement long dans le thread graphique est une mauvaise pratique, et Google, dans sa candeur (ça me fait drôle d'écrire ça) l'a juste déconseillé, avant de devoir mettre une exception (à partir de HoneyComb) devant le grand nombre d'applications subissant cette mauvaise pratique.

    Il faut que tu fasses ton traitement dans un autre thread que le graphique, donc intéresse-toi à la classe Thread, ou à la classe AsyncTask.

    De manière générale, les traitements (potentiellement) long ne doivent pas être dans le thread graphique, pour éviter le plus possible de geler l'interface utilisateur.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  3. #3
    Membre averti Avatar de Fooshi
    Homme Profil pro
    ICD
    Inscrit en
    Juin 2002
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ICD
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 507
    Points : 359
    Points
    359
    Par défaut
    Je n'arrive pas a logguer, LogCat ne me renvoie rien ...
    Le thread doit être fait dans l'activity ou se trouve la méthode setHeadBand ou celle de la méthode DownloadImage ? (Je débute vraiment sur Android et Java)

  4. #4
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Qu'entends-tu pas
    Je n'arrive pas a logguer, LogCat ne me renvoie rien ...
    ?

    Concernant le thread, tu le réalises ou tu le désirs ^^'

    Je te suggère plutôt de t'intéresser à la classe AsyncTask, elle correspondrait plus à ton besoin, je pense.

    En regardant le code de plus près, tu es sûr que les deux bouts de codes sont bien corrélés ?
    Tu invoques la méthode downloadImage avec 3 arguments. Dans la méthode, tu n'en a qu'un.

    Documentation : https://developer.android.com/refere...AsyncTask.html
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  5. #5
    Membre averti Avatar de Fooshi
    Homme Profil pro
    ICD
    Inscrit en
    Juin 2002
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ICD
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 507
    Points : 359
    Points
    359
    Par défaut
    C'est bon pour Logcat, je n'étais pas en vue DDMS.
    finalement j'ai opté pour la classe Thread et ça fonctionne.

    Le Thread :
    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
    // Thread
    	public class UnThread extends Thread{
    		private String url;
    		NetworkManagerDelegateBitmap delegate;
     
    		public UnThread(String url){
    			this.url		= url;
    		}
    		public void run(){
    			Bitmap bitmap	= null;
    			InputStream is	= null;
    			try{
    				HttpClient client	= new DefaultHttpClient();
    				HttpGet httpMethod	= new HttpGet(url);
     
    				HttpResponse response	= client.execute(httpMethod);
    				is	= response.getEntity().getContent();
    			}
    			catch(Exception e){}
     
    			try {
    				bitmap	= BitmapFactory.decodeStream(is);
    				is.close();
    			} catch (Exception e1) {}
    			delegate.receiveBitmap(bitmap);
    		}
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public Bitmap DownloadImage(String url){
    		UnThread	thread	= new UnThread(url);
    		thread.start();
     
     
    		return bitmap; (?)
    	}
    J'ai crée aussi un délégué défini comme ceci , pour que le thread retourne le bitmap à la fonction downloadimage:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    import android.graphics.Bitmap;
     
    public interface NetworkManagerDelegateBitmap {
    	public void receiveBitmap(Bitmap bitmap);
    }
    mais je ne sais pas encore l'implémenter, doit t'on faire un corps de fonction receiveBitmap ? a part le lancement du thread, que doit contenir la fonction downloadimage ?

Discussions similaires

  1. Réponses: 9
    Dernier message: 01/12/2005, 10h54
  2. Réponses: 5
    Dernier message: 07/07/2005, 10h20
  3. [vb.net] exception sur monForm.Show
    Par graphicsxp dans le forum Windows Forms
    Réponses: 2
    Dernier message: 04/07/2005, 12h27
  4. Exception sur Java Web Start
    Par Le Bressan dans le forum JWS
    Réponses: 5
    Dernier message: 01/02/2005, 10h52
  5. [Tomcat] Exception sur JSP
    Par Malaussene dans le forum Tomcat et TomEE
    Réponses: 7
    Dernier message: 10/09/2004, 08h43

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