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 :

Passer une bitmap d'un thread à un autre


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut Passer une bitmap d'un thread à un autre
    Bonjour à tous,

    Je développe une application qui doit aller lire une image jpg sur une socket puis l'afficher (c'est le principe général).

    Pour se faire j'ai une activité simple :

    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
    public class DisplayCamera extends Activity implements NetworkMessages
    {
     
    	@Override
        public void onCreate(Bundle savedInstanceState) 
        {
    		super.onCreate(savedInstanceState);
            setContentView(R.layout.display_camera);
     
            this.imagetest = (ImageView) findViewById(R.id.cam1);
            new ThreadCamera(mainHandler, Dp, camera, 1);
        }
     
    	private Handler mainHandler = new Handler()
    	{
    		public void handleMessage(Message msg)
    		{
    			switch(msg.what)
    			{	
    				case IMAGE : 
    				{
    					imagetest.setImageBitmap((Bitmap) msg.obj);
    				}
    			}
    		}
    	};
    }
    Ainsi qu'un thread d'écoute sur la socket qui vient lire les données :
    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
    public class ThreadCamera extends Thread implements NetworkMessages 
    {
     
    	public ThreadCamera(){}
     
    	public ThreadCamera(...)
    	{
    		//...
    	}
     
    	@Override
    	public void run()
    	{
    		this.setName("CameraThread_"+String.valueOf(id));
    		if(this.initSocket())
    		{
    			byte[] header 	= this.client.readInitialHeader();
    			if(header[0] == 1)
    			{
    				this.connected = true;
    				while(running && connected)
    				{
    					Bitmap bmap = this.getImage();
    					try {
    						sleep(this.camera.getMsForThisFps());
    					} catch (InterruptedException e) {
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					}
    				}
    			}
    		}
    	}
     
    	private Bitmap getImage()
    	{
    		Bitmap image = readJPG();
    		return image;
    	}
     
    	private Bitmap readJPG()
    	{
    		//Lecture de datas depuis la socket
    		image = BitmapFactory.decodeByteArray(datas, 0, tailleJpg);
     
    		return image;
    	}
    }
    Les données brutes de mon images sont bien lues et stockée dans un tableau de bytes. j'en fait ensuite une bitmap via BitmapFactory.decodeByteArray(datas, 0, tailleJpg). Ca semble également marcher puisque ça ne me renvoi pas nul.

    Mon souçis est le passage de cette bitmap vers le thread de l'UI et donc la mise à jour de l'imageView.

    J'ai d'abord essayé d'utiliser les messages :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    this.message		= this.handler.obtainMessage();
    this.message.what 	= IMAGE;
    this.message.obj 	= this.getImage();
    handler.sendMessage(this.message);
    mais sans grand succès (peut être ai je mal procédé). Le but étant de faire du mjpeg il y'a de forte chance qu'une image soit à transférer toutes les 40ms , il faudrait donc une solution performante.

    Comment transférer cette bitmap entre mes deux thread ?

    merci
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 11
    Par défaut
    Salut,

    tu as il me semble 3 possibilités.

    Tu peux faire un handler.post(), un runOnUiThread() ou une asyncTask.

    Pour les deux premiers, ne pas oublier new Runnable dans le constructeur.

    Dans ton cas, j'ai pas regardé en détail mais essaye :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Message message;
    message = handler.obtainMessage(IMAGE,(Object)getImage());
    handler.sendMessage(message);
    et moi j'utilise :

    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
     
    final Handler handler = new Handler() {
     
    		@Override
    		public void handleMessage(Message msg) {
     
    			switch(msg.what) {
    			case 0:
    				break;
    			default:
    				break;
    			}
    		}
     
    	};
    Remplace le case 0 par case IMAGE.

  3. #3
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Merci pour ta réponse.

    Ca marche avec les messages ! Reste à voir ce que cela va donner en augmentant le taux de rafraîchissement des images.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. passer une valeur d'un formulaire à un autre de page différentes
    Par ouakammathieu dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/12/2008, 14h05
  2. [1.1] passer une référence dans un thread
    Par melleb dans le forum C#
    Réponses: 4
    Dernier message: 26/05/2008, 11h17
  3. Comment passer une information entre des threads ?
    Par TheCaribouX dans le forum C#
    Réponses: 10
    Dernier message: 31/03/2008, 14h29
  4. Passer une variable d'un IF à l'autre
    Par JeanMi66 dans le forum Langage
    Réponses: 3
    Dernier message: 25/06/2007, 19h03
  5. [formulaire] passer une var d'un form à l'autre dans la même page
    Par rapanui dans le forum Balisage (X)HTML et validation W3C
    Réponses: 18
    Dernier message: 23/11/2006, 12h14

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