Φωτογραφία Χρήστος Μαργώνης
Σχετικά με LocationListener
από Χρήστος Μαργώνης - Sunday, 17 June 2012, 11:50 AM
 
Έχω υλοποιήσει το interface και μέσα στην onLocationChanged καλώ την run on first fix.
Είναι αυτό σωστή πρακτική;

Επίσης καλώντας την removeUpdates(this) στον location manager, κάνω unregister τον listener, σωστά; Γιατί όμως αφού συμβεί το unregister, όταν ξαναστέλνω συντεταγμένες το location μου στον χάρτη γίνεται update?
 
Φωτογραφία Μιχάλης Κεσκινίδης
Απάντηση: Σχετικά με LocationListener
από Μιχάλης Κεσκινίδης - Sunday, 17 June 2012, 12:36 PM
 
Σχετικά με την runOnFirstFix, η άποψη μου είναι ότι δεν πρέπει να την καλείς μέσα στην onLocationChanged. Αυτό γιατί δεν χρειάζεται να δημιουργείς ένα νέο νήμα κάθε φορά που αλλάζει η τρέχον τοποθεσία. Πρέπει να δημιουργηθεί μια φορά μόνο στην onCreate, τότε το νήμα τρέχει συνέχεια και κάνει animate την τοποθεσία μας.

Σχετικά με το δεύτερο ερώτημα. Όταν πλέον θα εμφανιστεί το MapActivity σου θα έχει γίνει register ο LocationListener και θα δεις το location σου στον χάρτη. Αν και για το location σου στον χάρτη είναι υπεύθυνο το νήμα που δημιουργείτε με την runOnFirstFix και δεν έχει να κάνει με τον LocationListener και το πότε γίνεται register ή unregister αυτός.

Κατά την άποψη μου και για να προσπαθήσω να ξεμπερδέψω τα πράγματα (αν είμαι σωστός σε αυτά που λέω), ισχύουν τα παρακάτω.

Ο LocationListener είναι για να ενημερώνει κάποια μεταβλητή με την τρέχουσα θέση μας και δεν έχει να κάνει με την κουκίδα (γραφικό) που δείχνει την θέση μας στον χάρτη.

Η θέση μας στον χάρτη ενημερώνεται από ένα νήμα που δημιουργείτε με την runOnFirstFix και είναι άσχετο με τον LocationListener.

Θα μπορούσε κάποιος να δημιουργήσει ένα μόνο από τα δύο προηγούμενα και για τις δύο λειτουργικότητες. Δηλαδή να δημιουργήσει μόνο το νήμα που θα κάνει animate την θέση μας αλλά και να ενημερώνει την μεταβλητή (που θα αποστέλλεται με sms). ή να υλοποιήσει τον LocationListener και με την onLocationChanged να γίνεται ενημέρωση της μεταβλητής αλλά και της τρέχουσας θέσης μας (κουκίδα στον χάρτη).

Βέβαια μπορούν να υλοποιηθούν και οι δύο λειτουργικότητες επιτελώντας κάθε μια τον σκοπό της.
Ως σκοπό έχω να βοηθήσω, αλλά μπορεί να κάνω και λάθος, το συζητάμε το θέμα ....
Φωτογραφία Βασίλης Κόλιας
Απάντηση: Σχετικά με LocationListener
από Βασίλης Κόλιας - Sunday, 17 June 2012, 7:58 PM
 

Δεν είμαι σίγουρος αν κατάλαβα καλά τι έχεις κάνει και πως το έχεις κάνει καθώς και τι θες ακριβώς να πετύχεις οπότε ότι θα πω μπορεί να είναι "εκτός".

Τα όσα είπε ο Μιχάλης είναι σωστά αν και δεν κατάλαβα το κομμάτι "Θα μπορούσε κάποιος να δημιουργήσει ένα μόνο από τα δύο προηγούμενα και για τις δύο λειτουργικότητες..."

Θέλω να σταθώ σε αυτό που είπες οτι έχεις υλοποιήσει το Interface.Αν κατάλαβα καλά προσπαθείς να πετύχεις την αλλαγή της κουκίδας του χρήστη στο χάρτη. Αν αυτό είναι το ζητούμενο τότε να σου πω πως οτι η κλάση MyLocationOverlay υλοποιεί από μόνη της το Interface LocationListener.

https://developers.google.com/maps/documentation/android/reference/com/google/android/maps/MyLocationOverlay?hl=ko-KR

Άρα γνωρίζει πότε να ανανεώσει τη θέση της κουκίδας στο χάρτη και το κάνει αυτόματα σε ξεχωριστό thread.

Η runOnFirstFix όπως το όνομά της υποδηλώνει προορίζεται για να καλείται μια φορά και δημιουργεί ξεχωριστό thread όπως είπε και ο Μιχάλης και εκτελεί το runnable που του περνάς. Θυμίζοντάς σου αυτό νομίζω οτι τώρα σου δίδεται και η απάντηση στο δεύτερο ερώτημά σου.

Φωτογραφία Μιχάλης Κεσκινίδης
Απάντηση: Σχετικά με LocationListener
από Μιχάλης Κεσκινίδης - Sunday, 17 June 2012, 9:08 PM
 
Αυτό που ήθελα να πω με το "Θα μπορούσε κάποιος να δημιουργήσει ένα μόνο από τα δύο προηγούμενα και για τις δύο λειτουργικότητες..." είναι ότι εάν ήθελε κανείς θα μπορούσε μέσα από το νήμα που δημιουργείτε μέσα από την runOnFirtFix να ανανεώνει [με τον κατάλληλο mutex (Synchronize)] την τρέχον θέση μιας μεταβλητής μέλος του Activity π.χ μια Location location.

Αφού μέσα στο νήμα μπορώ με την MyLocationOverlay.getMyLocation() να έχω ένα GeoPoint μπορώ επίσης να ανανεώσω την τιμή της location που ανέφερα προηγούμενος με τον παρακάτω κώδικα

float latitude = geoPoint.getLatitudeE6() / 1E6;
float longitude = geoPoint.getLongitudeE6() / 1E6;

location.setLatitude(latitude);
location.setLongitude(longitude);

Οπότε δεν είναι ανάγκη να υλοποιήσω το interface LocationListener και να ενημερώνω την τρέχον θέση της location.

Προσωπικά δεν το έχω υλοποιήσει με αυτόν τον τρόπο (άλλα ούτε ποτέ δοκίμασα αυτόν τον κώδικα). Απλά λέω ότι θεωρητικά θα μπορούσε να γίνει.
Φωτογραφία Βασίλης Κόλιας
Απάντηση: Σχετικά με LocationListener
από Βασίλης Κόλιας - Sunday, 17 June 2012, 9:18 PM
 

κατάλαβα τι λές και είναι δυνατόν και αυτό. Ο τρόπος που λες οτι το υλοποίησες με το Interface όμως είναι ευκολότερος.

Φωτογραφία Χρήστος Μαργώνης
Απάντηση: Σχετικά με LocationListener
από Χρήστος Μαργώνης - Monday, 18 June 2012, 6:41 AM
 
Μάλιστα, κατάλαβα, σας ευχαριστώ!