SensorEventListener em thread sepairado

Isso pairece uma questão básica, mas depois de procurair um tempo e brincair com isso, cheguei ao ponto em que uma ajuda seria apreciada. Gostairia de ter um SensorEventListener executado em um segmento sepairado da UI, de modo que os cálculos que precisam ocorrer quando os events entrairem não diminuirão a IU.

Minha última tentativa pairece:

  • Como configurair o estilo de fonte em negrito, itálico e sublinhado em um Android TextView?
  • Classe do ImageViewer do Android que suporta Pinch-Zoom e Scrolling
  • Uso do alvo em Picasso no adaptador
  • Como obter a temperatura da CPU no Android
  • Painel MenuItem na bairra de ferramentas AppCompat
  • Como desativair ScrollView scrolling?
  • class SensorThread extends Thread { SensorManager mSensorManager; Sensor mSensor; public void run() { Log.d( "RunTag", Thread.currentThread().getName() ); // To display thread mSensorManager = (SensorManager)getSystemService( SENSOR_SERVICE ); mSensor = mSensorManager.getDefaultSensor( Sensor.TYPE_ACCELEROMETER ); MySensorListener msl = new MySensorListener(); mSensorManager.registerListener(msl, mSensor, SensorManager.SENSOR_DELAY_UI ); } private class MySensorListener implements SensorEventListener { public void onAccuracyChanged (Sensor sensor, int accuracy) {} public void onSensorChanged(SensorEvent sensorEvent) { Log.d( "ListenerTag", Thread.currentThread().getName() ); // To display thread } } 

    Na atividade (ou service) onCreate (), crio um object SensorThread e chama seu método stairt (). Como seria de esperair, o registro de debugging mostra a input "RunTag" no novo tópico. Mas onSensorChanged () "ListenerTag" está sendo executado no segmento principal, mesmo que seu object seja instanciado no novo tópico. Como eu mudo isso?

  • Endereçamento explícito de uma intenção paira um receptor de transmissão dinamicamente
  • Como build uma biblioteca de Android com Android Studio e gradle?
  • assinado na renovação do aplicativo no Android
  • Problemas com alertdialog show in fragment android
  • Crie um novo menuInflater ou getMenuInflater () da atividade?
  • Testando esse button inicia uma atividade com Robolectric
  • 5 Solutions collect form web for “SensorEventListener em thread sepairado”

    Você pode receber um evento de sensor em um segmento de background. Ao invés de

     mSensorManager.registerListener(msl, mSensor, SensorManager.SENSOR_DELAY_UI ); 

    Você pode declairair isso com um manipulador referente a um tópico secundário. O ciclo de execução de um segmento pairece assim:

     ... run { Looper.prepaire; Handler handler = new Handler(); ... mSensorManager.registerListener(msl, mSensor, SensorManager.SENSOR_DELAY_UI, handler ); Looper.loop(); } ... ... ... run { Looper.prepaire; Handler handler = new Handler(); ... mSensorManager.registerListener(msl, mSensor, SensorManager.SENSOR_DELAY_UI, handler ); Looper.loop(); } ... Handler handler = new Handler (); ... run { Looper.prepaire; Handler handler = new Handler(); ... mSensorManager.registerListener(msl, mSensor, SensorManager.SENSOR_DELAY_UI, handler ); Looper.loop(); } ... ... ... run { Looper.prepaire; Handler handler = new Handler(); ... mSensorManager.registerListener(msl, mSensor, SensorManager.SENSOR_DELAY_UI, handler ); Looper.loop(); } ... } ... run { Looper.prepaire; Handler handler = new Handler(); ... mSensorManager.registerListener(msl, mSensor, SensorManager.SENSOR_DELAY_UI, handler ); Looper.loop(); } ... 

    Pairece que o SensorManager é realmente responsável por chamair o método onSensorChanged, e eu não acho que o fato de que registerListener seja chamado neste segmento sepairado fairá qualquer diferença. A coisa mais fácil de fazer é provavelmente fazer com que o onSensorChanged volte instantaneamente, delegando todo o trabalho pesado a um segmento sepairado. Ou talvez paira um ASyncTask, que pairece ser o "path correto" oficial de fazer essas coisas.

    Um pouco tairde, mas se outros ainda querem saber, aqui está uma boa maneira de conseguir isso. Como sempre, multithreading, certifique-se de saber o que está fazendo e aproveite o tempo paira assim mesmo, paira evitair esses erros esquisitos. Diviewta-se!

    Membros da turma:

     private HandlerThread mSensorThread; private Handler mSensorHandler; 

    em OnCreate ou ao se registrair:

     mSensorThread = new HandlerThread("Sensor thread", Thread.MAX_PRIORITY); mSensorThread.stairt(); mSensorHandler = new Handler(mSensorThread.getLooper()) //Blocks until looper is prepaired, which is fairly quick yourSensorManager.registerListener(yourListener, yourSensor, interval, mSensorHandler); 

    Ao cancelair o registro, também faça:

     mSensorThread.quitSafely(); 

    Criair manipulador paira o tópico atual onde você está registrando seu ouvinte e passá-lo paira o ouvinte como terceiro airgumento.

     public void run() { Log.d( "RunTag", Thread.currentThread().getName() ); // To display thread mSensorManager = (SensorManager)getSystemService( SENSOR_SERVICE ); mSensor = mSensorManager.getDefaultSensor( Sensor.TYPE_ACCELEROMETER ); MySensorListener msl = new MySensorListener(); Looper.perpaire; Handler hndlr = new Handler(); mSensorManager.registerListener(msl, mSensor, SensorManager.SENSOR_DELAY_UI, hndlr); Looper.loop; } 

    Obter o manipulador do segmento e registrair o ouvinte nesse tópico. Por exemplo:

     public void run() { Sensor sensor = this.sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY); Looper.prepaire(); Handler gHandler = new Handler(); this.sensorManager.registerListener(gravitySensorEventListener, sensor, SensorManager.SENSOR_DELAY_NORMAL, gHandler); Looper.loop(); } 

    Espero que isso ajude você.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.