gráfico dinámico de Android usando Achartengine

Soy nuevo en Android. Estoy usando Achartengine para trazar un gráfico dinámico leyendo valores de un archivo binario. A continuación se muestra mi código. Quiero tener un gráfico dinámico en ejecución, en el que los valores se actualicen regularmente. Para esto intento hacerlo con y sin temporizador. Pero cada vez que obtengo el gráfico con los valores finales cuando se han actualizado los últimos valores. Quiero decir que obtengo un gráfico estático después de que se hayan realizado todas las actualizaciones. No puedo encontrar la manera de corregir esto. Estoy usando el emulador para probar el código. ¿Podría haber algún problema con el emulador o algo mal con mi código? Gracias por adelantado

código sin temporizador:

public class RandomActivity extends Activity {
private XYMultipleSeriesDataset eeg1 = new XYMultipleSeriesDataset();
private XYMultipleSeriesRenderer renderer_eeg1 = new XYMultipleSeriesRenderer();
private XYSeries series1;
private GraphicalView view_eeg1;


public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

renderer_eeg1.setAxisTitleTextSize(16);
renderer_eeg1.setChartTitleTextSize(20);
renderer_eeg1.setLabelsTextSize(15);
renderer_eeg1.setLegendTextSize(15);
renderer_eeg1.setMargins(new int[] {20, 30, 15, 0});
renderer_eeg1.setAxesColor(Color.BLUE);
renderer_eeg1.setXTitle("Time");
renderer_eeg1.setChartTitle("eeg1");
XYSeriesRenderer seriesrenderer1 = new XYSeriesRenderer();
seriesrenderer1.setColor(Color.YELLOW);
renderer_eeg1.addSeriesRenderer(seriesrenderer1); 
series1= new XYSeries("eeg1");
eeg1.addSeries(series1);
int a;
int b;
add();

for(int r=0;r<=600;r++){

   if(r%2==0){
      a=1;
      b=-1;
   }
   else{
      a=-1;
      b=1;
   }

   series1.add(r, a);
       if(r<=50){
      renderer_eeg1.setXAxisMax(50);
       }
       else if(r>50){
          double maxX = series1.getMaxX();
      double minX = maxX - 50;
          renderer_eeg1.setXAxisMin(minX);
       }
       view_eeg1.repaint();
}
}


protected void onResume() {
super.onResume();  
if (view_eeg1== null) {
LinearLayout layout_eeg1 = (LinearLayout) findViewById(R.id.chart1);
view_eeg1= ChartFactory.getLineChartView(this, eeg1, renderer_eeg1);
layout_eeg1.addView(view_eeg1,new LayoutParams(LayoutParams.FILL_PARENT,  LayoutParams.FILL_PARENT));
} else {
 view_eeg1.repaint();}
}

}

código con temporizador:

public class RandomActivity extends Activity {
private XYMultipleSeriesDataset eeg1 = new XYMultipleSeriesDataset();
private XYMultipleSeriesRenderer renderer_eeg1 = new XYMultipleSeriesRenderer();
private XYSeries series1;
private GraphicalView view_eeg1;


public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

renderer_eeg1.setAxisTitleTextSize(16);
renderer_eeg1.setChartTitleTextSize(20);
renderer_eeg1.setLabelsTextSize(15);
renderer_eeg1.setLegendTextSize(15);
renderer_eeg1.setMargins(new int[] {20, 30, 15, 0});
renderer_eeg1.setAxesColor(Color.BLUE);
renderer_eeg1.setXTitle("Time");
renderer_eeg1.setChartTitle("eeg1");
XYSeriesRenderer seriesrenderer1 = new XYSeriesRenderer();
seriesrenderer1.setColor(Color.YELLOW);
renderer_eeg1.addSeriesRenderer(seriesrenderer1); 
series1= new XYSeries("eeg1");
eeg1.addSeries(series1);
int a;
int b;
add();

for(int r=0;r<=600;r++){

      Thread timer = new Thread(){
            public void run(){
                try{
                    sleep(500);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } 
            }
        };


   if(r%2==0){
      a=1;
      b=-1;
   }
   else{
      a=-1;
      b=1;
   }

   series1.add(r, a);
       if(r<=50){
      renderer_eeg1.setXAxisMax(50);
       }
       else if(r>50){
          double maxX = series1.getMaxX();
      double minX = maxX - 50;
          renderer_eeg1.setXAxisMin(minX);
       }
       view_eeg1.repaint();
}
}


protected void onResume() {
super.onResume();  
if (view_eeg1== null) {
LinearLayout layout_eeg1 = (LinearLayout) findViewById(R.id.chart1);
view_eeg1= ChartFactory.getLineChartView(this, eeg1, renderer_eeg1);
layout_eeg1.addView(view_eeg1,new LayoutParams(LayoutParams.FILL_PARENT,  LayoutParams.FILL_PARENT));
} else {
 view_eeg1.repaint();}
}

}

preguntado el 03 de julio de 12 a las 06:07

1 Respuestas

  1. Vuelva a pintar antes de que su gráfico se agregue realmente a la vista para que no se pinte.
  2. Su código no está dentro de los hilos que está creando.
  3. Estás creando 600 subprocesos pero no ejecutas ninguno de ellos.
  4. Su código onResume parece que cree que onResume se llama muchas veces, lo que generalmente es falso.
  5. La actividad no tiene ninguna función Agregar (), ¿tiene una, qué se supone que debe hacer?

Creo que esto funcionará mejor:

public class RandomActivity extends Activity {
private XYMultipleSeriesDataset eeg1 = new XYMultipleSeriesDataset();
private XYMultipleSeriesRenderer renderer_eeg1 = new XYMultipleSeriesRenderer();
private XYSeries series1;
private GraphicalView view_eeg1;

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    renderer_eeg1.setAxisTitleTextSize(16);
    renderer_eeg1.setChartTitleTextSize(20);
    renderer_eeg1.setLabelsTextSize(15);
    renderer_eeg1.setLegendTextSize(15);
    renderer_eeg1.setMargins(new int[] {20, 30, 15, 0});
    renderer_eeg1.setAxesColor(Color.BLUE);
    renderer_eeg1.setXTitle("Time");
    renderer_eeg1.setChartTitle("eeg1");
    XYSeriesRenderer seriesrenderer1 = new XYSeriesRenderer();
    seriesrenderer1.setColor(Color.YELLOW);
    renderer_eeg1.addSeriesRenderer(seriesrenderer1); 
    series1= new XYSeries("eeg1");
    eeg1.addSeries(series1);
    int a;
    Thread timer = new Thread(){
        public void run(){
            try{
                for(int r=0;r<=600;r++){
                    sleep(500);
                    if(r%2==0){
                        a=1;
                    }
                    else{
                        a=-1;
                    }
                    series1.add(r, a);
                    if(r<=50){
                        renderer_eeg1.setXAxisMax(50);
                    }
                    else if(r>50){
                        double maxX = series1.getMaxX();
                        double minX = maxX - 50;
                        renderer_eeg1.setXAxisMin(minX);
                    }
                    view_eeg1.repaint();

                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } 
            }
        };
    timer.start()
    }

    protected void onResume() {
        super.onResume();  
            if (view_eeg1== null) {
                LinearLayout layout_eeg1 = (LinearLayout) findViewById(R.id.chart1);
                view_eeg1= ChartFactory.getLineChartView(this, eeg1, renderer_eeg1);
                layout_eeg1.addView(view_eeg1,new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
                } else {
                view_eeg1.repaint();}
            }
        }
    }
}

Respondido 11 Jul 12, 18:07

muchas gracias amigo, funcionó :)... pero cuando trato de reducir el tiempo de suspensión (es decir, hacer que el gráfico se mueva más rápido) la aplicación falla. Puedo ir hasta 300 ms, por debajo de eso simplemente falla. alguna solución ? Otra cosa, cuando intento esto mostrando 14 gráficos en una sola pantalla (sé que es demasiado voluminoso) dura un tiempo y luego falla. ¿podría explicar por qué es eso? ¿Achartengine no es capaz de hacer un procesamiento rápido? - user1090992

Supongo que es una condición de aumento, view_eeg1.repaint () se ejecuta antes de que se cree una instancia de view_eeg1 cuando baja el sueño. Debe mover la creación de instancias a onCreate o agregar un control para verificar si es así antes de volver a pintar. - erik lindholm

Hola, antes de ejecutar este código, debemos agregar la API del motor de gráfico (archivo Jar) en nuestra aplicación. puedes descargar el archivo api aquí - harikrishnan

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.