Estoy tratando de obtener 100 lecturas del acelerómetro en 1 segundo, pero en lugar de 100 lecturas diferentes, me da 1 misma lectura 100 veces.

Estoy tratando de mostrar estas 100 lecturas del acelerómetro cuando presiono un botón en mi aplicación

Mi MainActivity tiene esta variable llamada

float ax;

Que es donde la lectura del acelerómetro (del eje x) se almacena continuamente.

Y tengo este código de botón en mi método OnCreate ()

 button = (Button)findViewById(R.id.startbutton); //inits button
    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {               
            BuildTable();
        }
    });

Que activa la función BuildTable () (que muestra la salida en la propia aplicación)

Mi BuildTable () tiene algo como esto

 public void BuildTable()
{       

    TableRow trow = new TableRow(this);
    TextView text = new TextView(this);       

    int count = 0;

    while (count < 100)
    {

        if(System.currentTimeMillis() - lasttime >= 10)
        {

            lasttime = System.currentTimeMillis();              
            text = new TextView(this);
            Log.d("MyApp","ax is: "+ax);
            text.setText(""+ax);
            trow = new TableRow(this);
            trow.addView(text);
            table.addView(trow,count);
            count++;

        }

    }
}

Y la función OnSensorChanged () se ve así

@Override
public void onSensorChanged(SensorEvent event) {     
    ax = event.values[0];      

}

Que solo actualiza ax.

¿Cómo pausa el clic del botón la actualización de ax? ¿Cómo puedo solucionar esto?

Salud

1
Last Man Standing 13 dic. 2016 a las 22:10

2 respuestas

La mejor respuesta

¡Encontré una manera de evitar el bucle congelado enSensorChanged ()!

Básicamente, tuve que implementar subprocesos múltiples con la ayuda de ejecutables y variables de 'bandera' (tenga en cuenta que las variables de 'bandera' deben ser estáticas ).

Coloqué mi función BuildTable () en un nuevo Runnable, que luego se insertó en un hilo. Entonces, hay un hilo principal (supongo que para la GUI) y un hilo separado, que tuvo que ser modificado para recibir y almacenar exclusivamente las lecturas del sensor.

Luego, la visualización real de estas variables en una tabla se ejecutó en el hilo principal (creo que se llama UIThread), con la ayuda de las variables de 'bandera' que también fueron modificadas por mi hilo de BuildTable () (de ahí las variables de 'bandera' debe ser estático ).

Puedo agregar fragmentos de código para obtener más sugerencias, pero quizás más tarde o cuando alguien lo pida, es un poco temprano en la mañana.

¡Salud!

0
Last Man Standing 26 dic. 2016 a las 16:00

Intente filtrar los resultados en la función onSensorChanged usando

@Override
public void onSensorChanged(SensorEvent event)
{    
   if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
   { 
       ax = event.values[0];      
   }
}
0
Kyle Sweet 13 dic. 2016 a las 19:36