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?
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
@ 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
@ 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