Probleme bei EditText und SensorEventListener

  • 6 Antworten
  • Letztes Antwortdatum
H

hatschy

Neues Mitglied
0
Hi!
Ich schreib ein App welches die Daten vom Beschleunigungssensor und Kompass aufzeichnet. Die aktuellen Werte stelle ich meiner View dar und werden mit onSensorChanged(SensorEvent event) aktualisiert.
Funktioniert wunderbar.

Weiter habe ich noch einige EditText Felder. Zb. einen Namen für die Aufzeichnung.
Solange der Sensor registriert ist, funktioniert leider das eintragen in das EditText nicht richtig.
- Das heißt der Text wird nicht gleich angezeigt.
- Erst durch das das drücken RückTaste erscheint das Wort.

Was läuft da falsch? Muss ich die Sensoren mit unregisterListener stoppen?
(Solange ich was im Textfeld ändere)
 
Öhm such mal hier in einem anderen Thread. Soweit ich weiß wird der sensorListener im MainThread ausgeführt, weshalb die UI "stoppt". Von daher solltest du den Listener in einen separaten Thread packen. Dann kannst du die UI verwenden...

Gruß
 
  • Danke
Reaktionen: hatschy
Danke! Ich werde es mal verseuchen! Ist schon ein bisschen her, dass ich was mit threads gemacht habe ;)
 
Irgendwie hat es nicht funktioniert. Mach es jetzt mit einem AlertDialog.Builder und einem eigenen Layout. Da geht gut und mehr platz hab ich auch.
 
Hey, bin mir recht sicher, dass es an der Implementierung des Sensorlisteners liegt, da dieser eine kleine Verzögerung benötigt. Mach mal ein delay (mit Hilfe von der System.currenttime Funktion ) vor der ersten Messung des Wertes, den du im Textfeld anzeigen willst.
Thread und Sensorlistener in Kombination hat sich bei mir immer wieder als unpraktisch herausgestellt.

Der ursprüngliche Beitrag von 19:40 Uhr wurde um 19:41 Uhr ergänzt:

Kannst auch gerne mal den Code auszugsweise posten ;-)

Der ursprüngliche Beitrag von 19:41 Uhr wurde um 19:46 Uhr ergänzt:

Dein Textfeld kannst du dann in onSensorChanged anhand der Werte, die du aus dem Sensor liest, ändern lassen. Wobei onAccurancyChanged leer bleibt.

Kann mir vorstellen, dass die Lösung mit dem alertdialog nicht auf jedem Gerät korrekt funktioniert. Sieht für mich so aus, als wenn du durch den alertdialog den nötigen delay hervorrufst. (nur eine Vermutung)
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: hatschy
Es liegt eindeudig am Sensorlisteners. Ich rufe ihn so auf:

Code:
 mSensorManager.registerListener(this, mAccelerometer,
 mSensorManager.SENSOR_DELAY_FASTEST);
wenn ich ihn so aufrufe gehts wunderbar.

Code:
 mSensorManager.registerListener(this, mAccelerometer, 
mSensorManager.SENSOR_DELAY_NORMAL);
Der Grund dass ich so eine hohe rate haben will ist, dass ich Kompass, Beschleunigunssensor(Schrittzähler) und WifiScaner während eines Testlaufes aufzeichnenen will und mit den Daten versuchen die Postions Veränderung zu berechnen.

In der View brauch ich es natürlich nicht so genau. ;) Aber leider bringt das auch nicht :
Code:
long time=System.currentTimeMillis();
        
        if ((time-lastViewupadte)>viewtimedelay)
        {
            oTVx.setText(......
            ...
            lastViewupadte=System.currentTimeMillis();
        }else
....
Der ganze Code ist leider zu Chaotisch. Hab das "try and error" Verfahren angewandt.
Ich hab auch Versucht Beschleunigungssensor in einer eigen Klasse implementiert und übergebe die TextView. Wenn ich die Klasse observabel mache wäre vielleicht besser, aber irgendwie bin mir da nicht Sicher wie das bei einem Listner geht.

Wie diese Sensor alle am besten zusammen arbeiten lasse ist mir noch nicht ganz klar. Alles in in die Main tun ist hat unübersichtlich und den Wifiscanner muss ich wohl irgendwie als Thread implementieren.
Okay aber so eine lange Geschichte ist hier wohl am falschen Platz ;)
 
Okay, jetzt verstehe ich um was es geht...
Hmm, ich denke die einfachste Lösung wäre die "Schrittmesser-Logik" in der onSensorChanged ablaufen zu lassen (die Implementierung kannst du ja über deine Activity prüfen - beispielsweise über TextViews - das nur vorläufig, um zu verstehen was das die Fktn macht) und dann, wenn sich alle Werte so verhalten, wie du es erwartest, von dort die Daten verwerten. Wobei ich da noch nicht genau weiß was du damit machen willst^^ ggf. irgendwo speichern und dann aus anderen Funktionen/Activities einlesen.

Hast du das mit dem Delay so, oder so ähnlich gemacht?
In der onCreate:
long_starttime abragen.

und dann wenn, deine Logik in der onSensorChanged ausgeführt werden soll, vorher prüfen:

Code:
if (long_starttime + 1500 < long_actualtime) {
[...]

ggf. ist bei deiner Sensorgenauigkeit auch ein größerer Delay notwendig.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: hatschy
Zurück
Oben Unten