Получение данных с сенсоров Android без Listeners

У меня есть следующий код:

public class readSensorsData extends Activity implements SensorListener {


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    sm = (SensorManager) getSystemService(SENSOR_SERVICE);     

}
@Override   
public void onSensorChanged(int sensor, float[] values) {
    synchronized (this) {
        if (sensor == SensorManager.SENSOR_ORIENTATION) {

        //get orientation       

        }
        if (sensor == SensorManager.SENSOR_ACCELEROMETER) {

         //get acceleration
             }                

        } 
        if (sensor == SensorManager.SENSOR_MAGNETIC_FIELD) {

         //get magnetic fiels
             }     
     Bundle bundle = new Bundle(); //results from activity
     bundle.putFloatArray("acceleration", array);

     Intent mIntent = new Intent();
     mIntent.putExtras(bundle);
     setResult(RESULT_OK, mIntent);
     finish();
        }

  public void onAccuracyChanged(int sensor, int accuracy) {

  }

@Override
protected void onResume() {
    super.onResume();
    sm.registerListener(this, 
            SensorManager.SENSOR_ORIENTATION |
      SensorManager.SENSOR_ACCELEROMETER |
      SensorManager.SENSOR_MAGNETIC_FIELD,
            SensorManager.SENSOR_DELAY_NORMAL);
}

@Override
protected void onStop() {
    sm.unregisterListener(this);
    super.onStop();


  }
}

код работает, но вот моя проблема: когда я вызываю его из основного действия таким образом:

     Intent i = new Intent(this, readSensorsData.class);
  startActivityForResult(i, 1); //1 is for sensors     
     for(int j=0;j<10;j++)
     {
                 //do sth else here!!!!
      try {
        Thread.sleep(1000);
      } catch (InterruptedException e) {e.printStackTrace();}
      //here code for showing result from sensor activity

     } 

тогда я могу увидеть 10 раз результат «делать что-то еще !!!» и когда цикл заканчивается, я вижу результат активности. Таким образом, сенсорная активность по какой-то причине ждет, а затем, когда основной активности нечего делать, сенсоры выполняют свою работу.

конечно, я хорошо реализовал: onActivityResult (int requestCode, int resultCode, намерение Intent)

Я хочу читать данные датчиков напрямую, не используя слушателей, возможно ли это?


person questioner    schedule 24.05.2010    source источник


Ответы (1)


Во-первых, никогда не вызывайте Thread.sleep() в основном потоке приложения.

Во-вторых, startActivityForResult() является асинхронным. Другая активность не будет запущена, когда startActivityForResult() вернется.

В-третьих, события датчика асинхронны.

Итак, сенсорная активность по какой-то причине ждет

Он не может запуститься, пока вы не выйдете из основного потока приложения, который связан вашими Thread.sleep() вызовами.

затем, когда основной деятельности нечего делать, датчики делают свою работу.

Именно так.

Я хочу читать данные датчиков напрямую, не используя слушателей, возможно ли это?

Нет. Просто используйте слушателей правильно. Вот три примера проектов, демонстрирующих использование прослушивателей датчиков.

person CommonsWare    schedule 24.05.2010
comment
в этих примерах вы просто используете 1 действие для 1 датчика, который я хочу отправить с помощью Wi-Fi пакета информации, включая ориентацию, ускорение и т. д., поэтому, помимо того факта, что я не могу использовать thread.sleep(), я все еще не могу знаю, как получить эти данные с датчиков, могу ли я вызвать startActivityForResult много раз, скажем, в цикле 1000 раз, запустить эту деятельность и уничтожить ... и так далее. На мой взгляд, это неэффективно, так как я могу это решить? Может через сервис? - person questioner; 24.05.2010
comment
хм, я думаю, что знаю, я просто буду использовать поток для работы с этими датчиками - person questioner; 24.05.2010
comment
Если вы хотите агрегировать или усреднять данные по 1000 отчетов, просто добавьте их в список ArrayList или что-то в onSensorChanged(). Когда придет 1000-й отчет, используйте AsyncTask для выполнения вычислений (если они есть) и отправки данных на ваш сервер. - person CommonsWare; 24.05.2010
comment
я хочу отправить информацию с датчиков, некоторый текст, другие данные в 1 пакете, а затем снова отправить ту же структуру обновленной информации, я не хочу получать 1000 результатов, а затем отправлять их, я хочу взять каждый фрагмент данных, а затем отправить и зациклить как: for(;;){ 1)брать новые данные с датчиков; 2) отправить его; } - person questioner; 24.05.2010