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:
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:
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:
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