SensorEventListener dans un fil séparé
Cela semble être une question de base, mais après avoir cherché pendant un moment et de jouer avec elle, j'en suis venu au point où certains d'aide serait appréciée. Je voudrais avoir un SensorEventListener exécuter dans un thread séparé de l'INTERFACE utilisateur, de sorte que les calculs qui doivent se produire lorsque des évènements à ne pas ralentir l'INTERFACE utilisateur.
De ma dernière tentative ressemble:
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
}
}
Dans l'activité (ou du service) onCreate(), j'ai créer un SensorThread objet et l'appel de la méthode start (). Comme vous vous en doutiez, le journal de débogage affiche le "RunTag" entrée dans le nouveau thread. Mais onSensorChanged()'s "ListenerTag" est en cours d'exécution dans le thread principal, même si son objet est instancié dans le nouveau thread. Comment puis-je changer cela?
source d'informationauteur Thinman
Vous devez vous connecter pour publier un commentaire.
Vous pouvez recevoir le capteur de l'événement dans un thread d'arrière-plan. Au lieu de
vous pouvez la déclarer avec un gestionnaire se référant à un thread secondaire. La course de la boucle de fil ressemble à ceci:
Un peu tard, mais si d'autres veulent toujours savoir, voici un bon moyen d'y parvenir. Comme toujours, quand le multithreading, assurez-vous que vous savez ce que vous faites et prenez le temps de sorte qu'il droite, afin d'éviter ces erreurs étranges. Amusez-vous!
Les membres de la classe:
dans OnCreate ou lors de l'inscription:
Lors de l'annulation de l'inscription, font aussi:
Il ressemble à la SensorManager est en fait responsable de l'appel de la onSensorChanged méthode, et je ne pense pas que le fait que registerListener est appelé dans ce thread va faire toute la différence. La meilleure chose à faire est sans doute de faire onSensorChanged retour instantanément, en déléguant tout le levage lourd pour un thread séparé. Ou peut-être à un ASyncTask, ce qui semble être le fournisseur officiel de "bonne façon" de faire de telles choses.
Obtenir le gestionnaire du fil et de registre de l'auditeur sur ce thread. Par exemple:
espère que ceci pourrait vous aider.
Gestionnaire de créer pour le thread en cours où vous enregistrez votre auditeur et de le transmettre à l'auditeur comme troisième argument.