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 :

AsyncTask et Thread UI


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    Développeur Java / C++
    Inscrit en
    Mars 2013
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java / C++

    Informations forums :
    Inscription : Mars 2013
    Messages : 128
    Par défaut AsyncTask et Thread UI
    Bonsoir tout le monde,

    Dans l'application que je développe, j'ai:
    - Un model, basé sur le DP Singleton
    - Une vue, représente le model, et écoute aussi le/les changements du model
    - Un objet héritant de AsyncTask<...> travaillant avec le modèle.

    Mon modèle permet, par le biais de méthode, de modifier son contenue, et chaque modification entraine l'appel au méthode d'écoute. Or, vue que l'AsyncTask modifie le contenue, celui-ci va aussi faire appelle au méthode d'écoute, et de ce fait appelle à des méthodes réservé au Thread UI, et ça ce n'est pas permis .

    Je pense que ce problème découle d'une mauvaise conception de ma part, j'essaye de mettre en place un DP MVC simplifié, il n'y a que le modèle et la vue, la vue se charge des contrôles. Je pense que mon implémentation de ce DP m'a fait aboutir à une mauvaise méthode de synchronisation entre ma vue et mon modèle.

    Dans le fichier word mis en pièce jointe, c'est un schéma représentant un exemple d'interaction entre les objets qui posent problème, cela peut vous aider à comprendre.

    Je cherche donc un moyen de contourner ce problème.

    Merci d'avance pour votre aide!
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour

    Or, vue que l'AsyncTask modifie le contenue, celui-ci va aussi faire appelle au méthode d'écoute, et de ce fait appelle à des méthodes réservé au Thread UI, et ça ce n'est pas permis .
    réservé ?

    J'ai un peu de mal a voir toutes les interactions, je comprends le principe, et surtout ce qui te pose problème. Est ce que tu aurais un exemple ?

  3. #3
    Membre expérimenté
    Homme Profil pro
    Développeur Java / C++
    Inscrit en
    Mars 2013
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java / C++

    Informations forums :
    Inscription : Mars 2013
    Messages : 128
    Par défaut
    Bonjour Feanorin,

    En fait, de manière plus simple, mon application aboutit à l'appelle de View.invalidate(), par le biais de mon AsyncTask, Or selon la documentation :
    Invalidate the whole view. If the view is visible, onDraw(android.graphics.Canvas) will be called at some point in the future. This must be called from a UI thread.
    Mais si j'avais lu jusqu'au bout, j'aurais vue:

    To call from a non-UI thread, call postInvalidate().
    Donc voila, lecture trop rapide de ma part, mais problème résolue en utilisant postInvalidate() en lieu et place de invalidate().

    Merci!

  4. #4
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Ou passer par un runOnUiThread ou par un Hanlde (message) également.

    Personnellement je préfère l'Handle car par cette méthode on peut centraliser toutes les modifications de l'UI depuis le Thread UI et non pas un peu dans chaque Thread

  5. #5
    Membre expérimenté
    Homme Profil pro
    Développeur Java / C++
    Inscrit en
    Mars 2013
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java / C++

    Informations forums :
    Inscription : Mars 2013
    Messages : 128
    Par défaut
    Je pouvais effectivement utiliser runOnUiThread, mais cela ne me plaisait pas trop dans l'idée car l'affichage de ma vue ce fait dans le Thread UI, mais mon objet AsyncTask représente un niveau logique indépendant de la vue (c'est un solveur de sudoku) donc pour moi il fallait que les deux soit bien distinct.

    Concernant l'Handle, il permet en effet d'envoyer des messages, mais entre thread seulement si j'ai bien compris? Et du coup, là encore dans mon esprit la synchronisation/mise à jour des donnés ne devais se faire qu'entre mon modèle et ma vue. Ce n'est pas au solveur d'informer la vue que des données ont été modifié (Principe de la responsabilité unique je crois ).

    Et dans les fait, ce n'est pas vraiment une modification de l'UI que je fait, mais une simple mise à jour des données à afficher (en l’occurrence les chiffres au sein de ma grille de sudoku pendant la résolution). Et cette partie sera par la suite optimisé en ne mettant à jour uniquement ce qui est nécessaire.

    Donc cette méthode m'a semblé la plus adaptée. Je te remercie pour ses informations Feanorin, qui pourront m'être utile dans mes futurs développement .

  6. #6
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Et dans les fait, ce n'est pas vraiment une modification de l'UI que je fait, mais une simple mise à jour des données à afficher
    Donc c'est bien une modification de l'UI.

    pour le Handler on aurait pu aussi le faire avec un Listener ce qui serait plus propre vu ta demande.

    Après le postInvalidate() fais le boulot .

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 12/02/2016, 12h01
  2. Synchronisation 2 thread asynctask
    Par jojo_ol76 dans le forum Android
    Réponses: 2
    Dernier message: 26/10/2011, 17h25
  3. Threads (AsyncTask) et rotations d'écran
    Par j0o0 dans le forum Android
    Réponses: 9
    Dernier message: 17/01/2011, 13h22
  4. Thread, Service, AsyncTask, Handler?
    Par androidisme dans le forum Android
    Réponses: 8
    Dernier message: 31/08/2010, 13h25

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