2012-07-09 11 views
5

Sto scrivendo questa applicazione in cui ottengo immagini live da una connessione TCP e ho bisogno di visualizzarle su un ImageViev.Come chiamare un asynctask all'interno di un evento click sul pulsante

Quello che sto facendo è chiamare asynctask all'interno del clic del pulsante. ma sembra che crei un numero di thread in background.

Questo è il codice per l'evento click del pulsante

btnLive.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 

     try 
     { 
      String name = ((Button)v).getText().toString(); 
      if(name.equalsIgnoreCase("Live")) 
      { 
       DataOutputStream dos; 
       DataInputStream dis; 
       String reply; 

       if(config.conn.isConnected()) 
       { 
        dos = new DataOutputStream(config.conn.getOutputStream()); 
        dos.writeBytes("STREAM-LIVE-IMAGES");          
        dos.flush(); 
        //dis = new DataInputStream(in); 

        in = config.conn.getInputStream();      
        while (true) 
        {        
         new myTask().execute(in); 
        } 
       }     
      } 
     } 
     catch(Exception ex) 
     { 
      Log.d("Live Button ", "Exception " + ex.getMessage()); 
     } 
    } 
}); 

e questo il codice per l'AsyncTask

class myTask extends AsyncTask<InputStream, Integer, Bitmap> { 

protected Bitmap doInBackground(InputStream...in) 
{ 
    Bitmap bmp = null; 

    try 
    { 
     //Do some none UI stuff here and return a value *result     
     byte[] rcvPacket = ReadJpegBinaryAndRemoveDelimiter(in[0]); 
     bmp = BitmapFactory.decodeByteArray(rcvPacket, 0, rcvPacket.length); 
     Log.d("Live Image Streaming ", "Recieved Images: " + rcvPacket.length + " " + bmp); 

    } catch (Exception e) { 
     e.printStackTrace();      
    } 
    return bmp; 
} 
+0

Non è possibile eseguire tanti AsyncTask come si desidera. C'è un limite per quello. – ania

+0

Immagino sia meglio qui implementare un servizio per il caricamento. Esegui questo servizio e passa lì la tua bitmap. – Yury

risposta

0

Sono riuscito a risolverlo con un thread in background perché asynctask non era l'opzione giusta per il mio problema.

Quindi ho creato un thread in background separato e ho utilizzato un metodo di invio post sulla visualizzazione di immagini per aggiornare l'interfaccia utente.

3
while (true) {        
new myTask().execute(in); 
} 

perché si sta eseguendo AsyncTask in loop, nel tuo caso in loop infinito, non suona molto bene, è necessario modificarlo.

È necessario eseguire al di fuori del ciclo. Non dovresti, non farlo.

Basta chiamare

new myTask().execute(in); 

senza loop.

+0

quindi il asynctask funzionerà da solo perché ho bisogno di mantenere le immagini in streaming fino a quando voglio interrompere lo streaming? Grazie per la pronta risposta –

+1

semplicemente non eseguirlo in loop. ogni volta che fai clic sul pulsante, esegui asynctask e lascia che faccia il suo lavoro. – Sajmon

+0

Quindi non mi darete le immagini dal vivo continuamente? quello di cui ho bisogno è come quando premo il pulsante live, dovrebbe far scorrere continuamente le immagini. La tua soluzione mi otterrà solo un'immagine con ogni clic del pulsante Immagino che sia –

Problemi correlati