2012-03-09 42 views
5

Soy nuevo en el desarrollo de aplicaciones de Android y tenía un problema con las tareas de Async. Así que estoy tratando de crear una aplicación de gráficos ECG que realice algunos procesamientos en segundo plano mientras se realiza la representación gráfica.Android tarea asincrónica ralentizando mi interfaz de usuario Subproceso

he definido la siguiente tarea asíncrono -

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 

Así que todo lo que estoy tratando de hacer es modificar el contenido de una matriz en particular en la tarea asíncrona - yo no tenga que actualizar la interfaz de usuario (por lo al menos no por ahora)

Sin embargo, cuando ejecuto esta tarea de sincronización, la gráfica de ECG se ralentiza y se vuelve desigual. Cuando comento la "nueva Erosión(). Execute();" parte en el código donde comienzo la tarea Async, la representación gráfica vuelve a ser normal.

¿No se supone que una tarea asíncrona está en un hilo separado y por lo tanto no afecta cómo están sucediendo las cosas en el hilo de la interfaz de usuario? ¿Qué estoy haciendo mal?

Respuesta

8

Incluso si ejecuta un código grande en una secuencia de fondo, la carga de la CPU del dispositivo aún se verá afectada y, por lo tanto, también podría ocasionar retrasos en la secuencia de la IU, especialmente si el dispositivo tiene una CPU de un solo núcleo.

Parece que tiene un bucle muy pesado en su método doInBackground, que se ejecuta constantemente y solo usa la CPU sin parar, lo que lo sobrecarga. No estoy seguro de lo que este bucle es de, pero si no tiene que actualizar constantemente puede que desee considerar la adición de un sueño hilo, permitiendo que otros hilos para conseguir más tiempo de CPU:

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

Obviamente, el " 100 "es solo un número, si la matriz puede actualizarse una vez por segundo, conviértala en 1000, etc. ...

+0

Sí, estoy ejecutando la tarea asincrónica constantemente porque estoy usando los datos de ECG para calcular la frecuencia cardíaca en tiempo real. Está pasando bastante trabajo, así que supongo que tu explicación tiene sentido. ¿Hay alguna otra cosa que no sea la tarea Async que pueda usar para realizar un trabajo de cálculo de fondo constante? – stu90

+3

@ stu90: "¿Hay alguna otra cosa que no sea la tarea Async que pueda usar para realizar un trabajo de cálculo de fondo constante?" - Nada que cambie tu problema. Ese hilo ya está configurado con prioridad de fondo, pero eso no ayudará mucho con el ciclo ocupado que tiene. Los bucles ocupados como este se han considerado de mala calidad durante un par de décadas. Debe establecer una frecuencia de muestreo y permitir que otros hilos tengan una oportunidad en la CPU, como sugiere Talihawk. También es mejor utilizar tu propio hilo, en lugar de bloquear un hilo del grupo 'AsyncTask' indefinidamente. – CommonsWare

+0

@ stu90 Puede usar un servicio en lugar de una tarea asíncrona, pero dudo que eso solo haga una gran diferencia en el rendimiento. Podría indicar que el Servicio se ejecute en un proceso separado de Linux, pero nuevamente no puedo decir si eso importará o no. Sin embargo, esto debería ayudarlo a comenzar: http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html – elevine

0

¿Por casualidad está ejecutando new Erosion().execute(); varias veces? Eso podría causarlo porque está asignando un nuevo AsyncTask varias veces.

+0

¡solo una vez! pero se ejecuta durante un período muy largo en el fondo ... así que supongo que es por eso que está tomando demasiados recursos de la CPU. – stu90

Cuestiones relacionadas