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 :

Modifier valeur d'un objet à l'intérieur d'un autre objet


Sujet :

Android

  1. #1
    Rédacteur

    Homme Profil pro
    Technical Lead Salesforce
    Inscrit en
    Février 2009
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technical Lead Salesforce

    Informations forums :
    Inscription : Février 2009
    Messages : 563
    Points : 1 667
    Points
    1 667
    Par défaut Modifier valeur d'un objet à l'intérieur d'un autre objet
    Bonjour,

    Dans l'une de mes méthodes qui doit renvoyer un objet de type InputStream, je déclare cet objet (inputStream) et j'instancie un thread et je souhaiterais pouvoir modifier la valeur de l'inputStream à l'intérieur de cet objet (thread).

    Le problème est que si je ne déclare pas mon inputStream en final, je n'arrive pas à y avoir accès à l'intérieur de mon thread mais dans ce cas, il est final et donc par conséquence, pas modifiable puis je ne souhaite pas créer une variable de classe inputStream puisque ma classe (mapper) n'est pas composée d'un inputStream, je suis donc bloqué et mes connaissances en Java sont limitées même si j'essaie d'apprendre..

    Voici ma 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
    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
     
    private InputStream getInputStream(String url) throws MalformedURLException, IOException, NullPointerException {
     
    		final String strUrl = url;
    		InputStream inputStream = null;		
     
    		Thread thread = new Thread(){
     
    			public void run(){
     
    				Looper.prepare();
     
    				// Connexion au serveur pour communiquer avec
    				DefaultHttpClient client = new DefaultHttpClient();
    				HttpConnectionParams.setConnectionTimeout(client.getParams(), 15000);
     
    				HttpResponse response;
    				HttpEntity entity;
     
    				try{
     
    					HttpPost post = new HttpPost(strUrl);
     
    					post.setHeader("Content-Type", "application/x-www-form-urlencoded");
     
    					// Passage des parametres par le script en POST
    					post.setEntity(new UrlEncodedFormEntity(null, HTTP.UTF_8));
     
    					// Recuperation du resultat du script
    					response = client.execute(post);
     
    					entity = response.getEntity();
     
    					inputStream = entity.getContent();
     
    					inputStream.close();
     
    					if(entity != null){
    						entity.consumeContent();
    					}
     
    				} catch(NullPointerException e) {
    					throw e;
    				}catch(Exception e){
    					Log.e(this.getClass().getName(), "Exception à l'ajout d'une règle", e);
    				}			    
     
    				Looper.loop();
    			}
    		};
     
    		thread.start();		
     
    		return inputStream;
    	}
    Si vous avez une idée, je suis preneur.
    - Mes articles
    - Consultant technique Salesforce
    - Salesforce Certified Administrator
    - Salesforce Certified Platform App Builder
    - Salesforce Certified Developper I
    - Salesforce Certified Sales Cloud
    - Salesforce Certified Service Cloud

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Points : 653
    Points
    653
    Par défaut
    Réponse directe, tu peux utiliser un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public void method() {
        InputStream is = ...
        final InputStream[] tab = new InputStream[] {is};
     
        Thread thread = new Thread() {
            @Override
            public void run() {
                tab[0] = new FileInputStream("file");
            }
        }
    }
    Mais attention à ton implémentation. Ta méthode à toi retourne un input stream. Aies bien conscience que lorsque la méthode va retourner, le thread n'aura sans doute pas eu le temps de démarrer, et donc ta méthode retournera null.

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Je suppose que le but recherché c'est que l'appelant dispose d'un inputStream, qu'il utilisera celui là quelque part dans un futur plus ou moins proche, et que tu voudrais te garder la possibilité de paralléliser la connexion http et le reste des calculs de l'appelant.


    Ce que tu propose de faire, c'est de la grosse bidouille, ça devrait être à ton appelant de se charger du parallélisme. C'est très dur à réaliser par derrière sans qu'on ne voie rien de l'appelant :/


    Si tu veux quand même t'obstiner, je renverrais ma propre implémentation de InputStream, qui serait un wrapper du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class FutureInputStream extends InputStream{
        private Future<InputStream> future;
        public FutureInputStream(Future<InputStream> future) {this.future=future;}
        public int available(){return future.get().available();}
        public int read(){return future.get().read();}
        // etc.
    }
    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
    private InputStream getInputStream(String url) throws MalformedURLException, IOException, NullPointerException {
     
    		final String strUrl = url;
    		InputStream inputStream = null;		
     
    		Callable<InputStream> callable = new Callable<InputStream>{
     
    			public InputStream call(){
     
    				// ton bordel ici qui retourne un inputstream
    			}
    		};
     
                           FutureTask<InputStream> futureTask = new FutureTask<InputStream>(callable);
    		new Thread(futureTask).start();		
     
    		return new FutureInputStream(futureTask);
    	}

  4. #4
    Rédacteur

    Homme Profil pro
    Technical Lead Salesforce
    Inscrit en
    Février 2009
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technical Lead Salesforce

    Informations forums :
    Inscription : Février 2009
    Messages : 563
    Points : 1 667
    Points
    1 667
    Par défaut
    Je me posais la question, savoir qui devait faire le traitement dans un autre thread, l'appelant ou directement la méthode concernée mais apparemment, c'est l'appelant.

    Réellement, mon code est comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public List<Rules> getRules(String url){
       List<Rules> listRules = new ArrayList<Rules>();
       final String strUrl = url; 
       InputStream is = null;
       Thread thread = new Thread(){
          is = getInputStream(strUrl);
       };
       return listRules;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public InputStream getInputStream(){
       ...
       return inputStream;
    }
    Je sais que le code de la fonction getRules() n'est pas bon mais je voulais simplement montrer l'idée.
    - Mes articles
    - Consultant technique Salesforce
    - Salesforce Certified Administrator
    - Salesforce Certified Platform App Builder
    - Salesforce Certified Developper I
    - Salesforce Certified Sales Cloud
    - Salesforce Certified Service Cloud

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    et ton getRules, il fait quoi de l'inputStream? Parce que si c'est pour le consommer tout de suite, le thread n'a aucune raison d'être.

  6. #6
    Rédacteur

    Homme Profil pro
    Technical Lead Salesforce
    Inscrit en
    Février 2009
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technical Lead Salesforce

    Informations forums :
    Inscription : Février 2009
    Messages : 563
    Points : 1 667
    Points
    1 667
    Par défaut
    A partir de la version 3 d'androïd, il faut obligatoirement faire passer ce qui est réseau sur un autre thread sinon ca renvoit une exception "NetworkOnMainThreadException" vu que c'est une mauvaise pratique mais effectivement, je souhaite l'utiliser immédiatement.
    - Mes articles
    - Consultant technique Salesforce
    - Salesforce Certified Administrator
    - Salesforce Certified Platform App Builder
    - Salesforce Certified Developper I
    - Salesforce Certified Sales Cloud
    - Salesforce Certified Service Cloud

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ok, c'est du android, donc tu résoud pas ton problème. Pourquoi? Parce que tu va quand même attendre la fin du thread en question, et donc tu aura toujours le même problème de base pour lequel cette exception a été créée: On ne fait pas attendre le thread d'affichage non did jou

    Ce n'est pas seulement la connection que tu doit mettre à part, c'est tout ce qui en découle. donc prend tout ta logique (rapatriement des données, traitement, mise en forme) et met le tout dans un thread à part et, à la fin de ce thread, met à jour l'affichage.

  8. #8
    Rédacteur

    Homme Profil pro
    Technical Lead Salesforce
    Inscrit en
    Février 2009
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technical Lead Salesforce

    Informations forums :
    Inscription : Février 2009
    Messages : 563
    Points : 1 667
    Points
    1 667
    Par défaut
    J'ai résolu mon problème en créant une méthode qui s'occupe d'exécuter mon traitement réseau dans un autre thread et de ce fait, ca me permet de le ré-exécuter autant de fois que je veux.
    - Mes articles
    - Consultant technique Salesforce
    - Salesforce Certified Administrator
    - Salesforce Certified Platform App Builder
    - Salesforce Certified Developper I
    - Salesforce Certified Sales Cloud
    - Salesforce Certified Service Cloud

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/04/2012, 20h29
  2. Cloner un objet à l'execution d'un autre objet
    Par labhalla dans le forum Langage
    Réponses: 1
    Dernier message: 12/03/2011, 18h15
  3. Accéder à la valeur d'une fonction à l'intérieur d'une autre fonction
    Par arno974 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 30/05/2010, 21h41
  4. Pb d'appel d'objet a partir d'un autre objet
    Par sebastien2222 dans le forum Langage
    Réponses: 11
    Dernier message: 31/05/2006, 10h49
  5. Un objet rendu apparaît derrière un autre objet
    Par jamal24 dans le forum OpenGL
    Réponses: 2
    Dernier message: 01/05/2003, 21h47

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