2012-03-09 4 views
5

Sono nuovo nello sviluppo di applicazioni Android e ho riscontrato un problema con le attività Async. Quindi sto provando a creare un'applicazione per grafici ECG che esegua qualche elaborazione in background mentre il grafico sta accadendo.Attività Async Android che rallenta il thread della mia interfaccia utente

ho definito la seguente attività Async -

private class Erosion extends AsyncTask <Void,Void,Void> { 


    @Override 
    protected Void doInBackground(Void...unused) { 

     int i,tempIndex; 
     double[] tempArray = new double[13]; 
     double min = ecgSamples[ecgSampleForErosionIndex] - gArray[0]; 
     while (ecgIncoming) 
     { 
      if (ecgSampleForErosionIndex > 179999) 
      { 
       ecgSampleForErosionIndex = 0; 
      } 

      for(i= 0;i<13;i++) 
      { 
       tempIndex = ecgSampleForErosionIndex + i; 
       if (tempIndex > 179999) 
       { 
        tempIndex = (ecgSampleForErosionIndex + i) - 180000; 
       } 
       tempArray[i] = ecgSamples[tempIndex] - gArray[i]; 
       if (tempArray[i] < min) 
       { 
        min = tempArray[i]; 
       } 

      } 

      //min needs to be stored in the erosionFirst Array 

      if (erosionFirstArrayIndex > 179999) 
      { 
       erosionFirstArrayIndex = 0; 
      } 


      ecgErosion[erosionFirstArrayIndex] = min; 
      erosionFirstArrayIndex++; 
      ecgSampleForErosionIndex++; 


     } 
     return null; 


    } 

    } //End of Async Task 

Quindi tutto quello che sto cercando di fare è modificare il contenuto di una particolare matrice nel compito asincrona - non ho bisogno di aggiornare l'interfaccia utente (ad almeno non per ora)

Tuttavia, quando eseguo questo task asincrono il mio grafico ECG rallenta e diventa a scatti. Quando commento la "nuova Erosion(). Execute();" parte nel codice in cui avvio il task Async, il grafico diventa di nuovo normale.

Non è un task asincrono supposto essere su un thread separato e quindi non influisce sul modo in cui le cose stanno accadendo sul mio thread UI? Che cosa sto facendo di sbagliato?

risposta

8

Anche se si esegue un pezzo di codice pesante su un thread in background, questo influirà comunque sul carico della CPU del dispositivo e potrebbe quindi causare ritardi anche nel thread dell'interfaccia utente, specialmente se il dispositivo è dotato di CPU single-core.

Sembra che tu abbia un ciclo molto pesante nel tuo metodo doInBackground, che gira costantemente e usa semplicemente la CPU non-stop, che la sovraccarica. Non sono sicuro di ciò che questo ciclo è per, ma se non ha bisogno di aggiornare costantemente si potrebbe prendere in considerazione l'aggiunta di un sonno filo, permettendo ad altri thread di ottenere più tempo di CPU:

while (ecgIncoming) 
    { 
     ... do your thing ... 
     Thread.sleep(100); // wait for 100 milliseconds before running another loop 
    } 

Ovviamente la " 100 "è solo un numero, se l'array può aggiornarsi una volta al secondo, renderlo un 1000, ecc ...

+0

Sì, eseguo costantemente il task asincrono perché sto utilizzando i dati ECG per calcolare la frequenza cardiaca in tempo reale. È un lavoro piuttosto pesante, quindi credo che la tua spiegazione abbia senso. C'è qualcos'altro oltre al compito Async che posso usare per eseguire un lavoro di calcolo di background costante? – stu90

+3

@ stu90: "C'è qualcos'altro oltre all'attività asincrona che posso usare per eseguire un lavoro di calcolo di background costante?" - Nulla che cambierà il tuo problema. Quel thread è già impostato su priorità dello sfondo, ma ciò non sarà di grande aiuto con il ciclo occupato. I cicli occupati come questo sono stati considerati una forma scadente per un paio di decenni. È necessario stabilire una frequenza di campionamento e consentire ad altri thread una possibilità per la CPU, come suggerisce Talihawk. Inoltre, è meglio che tu stia biforcando il tuo thread, piuttosto che legare indefinitamente un thread dal pool 'AsyncTask'. – CommonsWare

+0

@ stu90 È possibile utilizzare un servizio invece di un'attività asincrona, ma dubito che da solo farà molta differenza nelle prestazioni. È possibile importare quel servizio per eseguirlo su un processo Linux separato, ma ancora una volta non posso dire se ciò sarà importante o meno. Questo dovrebbe aiutarti a iniziare: http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html – elevine

0

Per caso stai correndo new Erosion().execute(); più volte? Ciò potrebbe causare perché stai assegnando una nuova AsyncTask più volte.

+0

no solo una volta! ma funziona per un periodo molto lungo in background ... quindi credo che sia il motivo per cui sta assorbendo troppe risorse della CPU. – stu90

Problemi correlati