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 :

Utilisation d'une fenêtre indiquant un traitement


Sujet :

Android

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 115
    Par défaut Utilisation d'une fenêtre indiquant un traitement
    Bonjour

    Je suis en train de récupérer des informations sur Internet : pendant ce traitement je veux afficher un fenêtre indiquant qu'il y a un traitement en cours (du type ProcessDialog) et je veux bloquer pendant ce temps là la thread principale.


    J'ai fait ce type de classe :

    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
     
    public class Internet {
     
    //...
     
    public String Execute() {
    		final ProgressDialog prd = ProgressDialog.show(ctx, "...", "...", true, false);
     
    		Traitement();
     
    		prd.dismiss();
    		return "OK";
    	}
     
    //....

    Le ProgressDialog ne s'affiche pas. Si j'enlève la ligne concerne le traitement et l'appel à la fonction "dismiss", le ProgressDialog va s'afficher dans ce cas là.

    Pourquoi ?


    Autre test : j'ai utilisé une thread que je démarre dans ma fonction "Execute": dans ce cas là, j'arrive à faire tourner le traitement avec le ProgressDialog mais par contre je sors de ma fonction "Execute" avant la fin de la thread (en fait la fonction Execute doit retourner une valeur déterminée dans le traitement de récupération => il me faut donc attendre la fin du traitement avant de retourner la valeur)


    Quelqu'un aurait-il une idée sur le sujet ?


    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 : 41
    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
    Par défaut
    Salut,

    Sans plus de code, difficile de te donner la bonne réponse, mais le cas d'erreur le plus fréquent, est que tu lance ton traitement sur le même thread que l'affichage.
    Du coup, ça pose un soucis.
    Va voir ici si tu veux plus d'informations : http://davy-leggieri.developpez.com/...oid/ui-thread/

    Et sinon pour ton problème : http://www.developpez.net/forums/d90...d/#post5298490

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 115
    Par défaut
    Salut

    En fait j'ai mis en place la classe AsyncTask pour gérer cela : cela marche bien...


    Mais il me reste un petit souci (je vais essayer d'être le plus clair possible) : j'utilise ce principe dans une classe A de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public fct () {
       Appel de mon AsyncTask 
    }
    Dans une classe B j'appelle la fonction fct de la classe A de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public Appel() {
    fct();
    ... // Suite de mon code
    }
    Dans la suite de mon code de la fonction Appel je veux utiliser le résultat que j'obtiens à la fin de l'AsyncTask . Or je passe dans la suite de mon code avant que l'AsyncTask finisse...

    Comment faire ?

    Merci d'avance

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par TsCyrille Voir le message
    Or je passe dans la suite de mon code avant que l'AsyncTask finisse...
    c'est fait pour

    pour savoir quand c'est fini, il te faut implémenter la fonction onPostExecute du asyncTask.
    Attention, normalement un asyncTask ne peut être lancé qu'une fois. Il te faut en instancier un à chaque exécution.

  5. #5
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 115
    Par défaut
    Mais comment renvoyer une info à la classe appelante (la classe B dans mon cas) dans la fonction onPostExecute ?

    C'est là mon problème...


    Pour info :
    - la classe A ne dérive de rien
    - la classe B dérive d'une Activity



    Merci d'avance

  6. #6
    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 : 41
    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
    Par défaut
    Tu peux implémenter un mécanisme de listener par exemple.
    Ca devrais pouvoir répondre à ton besoin.

  7. #7
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 115
    Par défaut
    Qu'entendez-vous par "listener" ? En fait je ne vois pas trop comment faire...

    Merci pour votre aide

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par TsCyrille Voir le message
    Mais comment renvoyer une info à la classe appelante (la classe B dans mon cas) dans la fonction onPostExecute ?

    C'est là mon problème...


    Pour info :
    - la classe A ne dérive de rien
    - la classe B dérive d'une Activity



    Merci d'avance
    si ton asynck task est une inner class t'y as accès directement. Sinon ça dépend. la méthode des listeners (méthode utilisé par Button par exemple) est trés simple à faire.

    Sans code difficile de te donner une meilleur réponse....
    Mais les asyncTask c'est fait pour cela, et il semble qu'il évite des problèmes par rapport à l'utilisation d'un handler mais j'ai pas compris.

  9. #9
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 115
    Par défaut
    Ma classe A est la suivante

    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
    public class A {
     
        public A() {
        }
     
     
        public void fct() {
           launchAction();
       }
     
       public void launchAction() {
     
    		final ProgressDialog progressDialog = ProgressDialog.show(Context, "Hello", "word", true,false);
     
    		//Définition de la tâche
    		AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
    			@Override
    			protected Void doInBackground(Void... params) {
     
    				//action exécuté dans le thread
    				return null;
    			}
     
    			@Override
    			protected void onPostExecute(Void result) {
    				//Fonction appelé à la fin du traitement traitement
    				progressDialog.dismiss();
    			}
     
    		};
    		//Lance le thread
    		task.execute((Void[])null);
    	}
    }

    Ma classe B est la suivante :

    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
    public class B extends Activity implements OnClickListener {
     
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.login);
     
            ((Button)this.findViewById(R.id.Button01)).setOnClickListener(this);
        }
     
       public void onClick(View v) {
           A inst= new A();
           inst.fct();
     
           // Suite de mon code (1)
           }
    };

    Donc comment récupérer les informations de l'AsyncTask dans la suite de mon code (1) ? Ou dois je les récupérer dans une autre fonction ?

    Merci

  10. #10
    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 : 41
    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
    Par défaut
    Merci d'effectuer un minimum de recherches.

    Exemple de Listener :
    http://java.developpez.com/faq/java/...#CreerListener

  11. #11
    Membre confirmé Avatar de cad13
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 247
    Par défaut
    Sinon pour faire simple, tu peux utiliser mon extrait de code :

    (on considère que ton accès à internet est fait dans une activity séparée, que tu lances de ton activity principale)
    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
    // use a Handler to update the UI (send the Handler messages from other threads)
    private final Handler authHandler = new Handler() {
    	@Override
    	public void handleMessage(final Message msg) {
     
    		// on efface d'abord la boite de dialogue (progress)
    		progressDialog.dismiss();
    		if (httpclient != null) {
    			httpclient.getConnectionManager().shutdown();
    			httpclient = null;
    		}
    		setResult(Traitement_OK);
    		finish();
    	}
    };
     
    private void ConnexionInternet() {
    // ta procédure d'accès internet
     
    	// Affichage de la boite de dialogue
    	progressDialog = ProgressDialog.show(AgoraAccountClient.this, 
    			"Accès à INTERNET", "Connexion...");
    	progressDialog.setCancelable(false);
     
    	// do the HTTP dance in a separate thread
    	new Thread() {
    		@Override
    		public void run() {
    			String errorMessage = null;
    			try {
     
    				// Ici tu fais ton accès à internet (GET et/ou POST)
     
    				httppost.abort();
    				Message msg = authHandler.obtainMessage();
    				msg.what = AuthToken;
    				msg.obj = content;
    				authHandler.sendMessage(msg);
     
    			} catch (UnknownHostException e) {
    				errorMessage = e.getMessage();
    				e.printStackTrace();
    			} catch (SocketTimeoutException e) {
    				errorMessage = e.getMessage();
    				e.printStackTrace();
    			} catch (ClientProtocolException e) {
    				errorMessage = e.getMessage();
    				e.printStackTrace();
    			} catch (IOException e) {
    				errorMessage = e.getMessage();
    				e.printStackTrace();
    			} finally {
    				if (errorMessage != null) {
    					Message msg = authHandler.obtainMessage();
    					msg.what = AuthUnknownHostException;
    					msg.obj = errorMessage;
    					authHandler.sendMessage(msg);
    				}
    			}
    		}
    	}.start();
    }
    Et tu ajoutes ces deux procédures à ton 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
    @Override
    public void onPause() {
    	super.onPause();
    	if (this.progressDialog != null && this.progressDialog.isShowing()) {
    		this.progressDialog.dismiss();
    	}
    }
     
    @Override
    protected void onDestroy() {
    	super.onDestroy();
    	if (httpclient != null) {
    		httpclient.getConnectionManager().shutdown();
    		httpclient = null;
    	}
    }
    Dans les déclarations, il faut bien sûr que tu déclares :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private ProgressDialog progressDialog;

  12. #12
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 115
    Par défaut
    Bonjour

    J'y suis enfin arriver en utilisant un mécanisme de Listener...

    Merci à vous tous pour votre aide...

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

Discussions similaires

  1. [WD9] Utilisation d'une fenêtre interne
    Par pierreaigle dans le forum WinDev
    Réponses: 6
    Dernier message: 26/01/2010, 20h04
  2. Utilisation d'une fenêtre TDialog sous windows
    Par mohira dans le forum C++Builder
    Réponses: 8
    Dernier message: 24/12/2009, 07h38
  3. [SNMP] Utilisation d'une mib privée (et traitement via perl)
    Par Tivan dans le forum Développement
    Réponses: 4
    Dernier message: 12/10/2009, 14h33
  4. Utilisation d'une fenêtre flottante
    Par ChPr dans le forum NetBeans
    Réponses: 1
    Dernier message: 08/05/2007, 10h42
  5. Réponses: 5
    Dernier message: 06/07/2005, 14h51

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