Autore Topic: Condividere oggetti tra activity  (Letto 777 volte)

Offline array81

  • Utente junior
  • **
  • Post: 64
  • Respect: 0
    • Mostra profilo
    • MartinZone
  • Dispositivo Android:
    OnePlus One, Nexus S
  • Play Store ID:
    MartinZone
  • Sistema operativo:
    Windows 7
Condividere oggetti tra activity
« il: 23 Maggio 2014, 11:00:33 CEST »
0
Da quanche settimana mi sto dedicando alla creazione della mia prima app per Android. Lo sto facendo non conoscendo nulla di Java, conosco ovviamente altri linguaggi quindi non sono del tutto nuovo alla programmazione ma non ho mai programmato in Java.
Ciò nonostante dopo circa 20 giorni ho terminato circa l'80% della mia applicazione che non è proprio banalissima (JSON, richieste a server, download file, google maps, compass, ...).
Insomma sono veramente soddisfatto, merito sopratutto della community e del lavoro di google su Android Studio.
Faccio questa premessa perchè forse le domande che vado a porvi potranno sembravi banali o fatte con terminologia non corretta.

PRIMA DOMANDA
Nella mia applicazione ho bisogno di localizzare l'utente tramite GPS, per fare questo ho creato una class apposita del tipo:

Codice (Java): [Seleziona]
public class GPSTracker extends Service implements LocationListener {
...
}

quindi nella main activity creo un oggetto del tipo con il codice:
Codice (Java): [Seleziona]
gpsTracker = new GPSTracker(MapsActivity.this, true);
ora ho bisogno di accedere alla variabile gpsTracker anche da una seconda activity per ottenere la latitudine e la longitudine, il mio dubbio è che visto che le activity hanno un determinato ciclo di vita penso sia possibile che all'apertura della seconda activity la prima activity possa essere fermata e che il relativo oggetto gpsTracker distrutto. Sbaglio? Come faccio ad evitare che un oggetto dichiarato in un'altra activity non sia più accessibile dall'activity principale?

SECONDA DOMANDA
nella mia classe GPSTracker posso ovviamente usare l'evento onLocationChanged per sapere quando le coordinate cambiano. Quindi dalla mia actvity posso accedere alle coordinate con il codice:

Codice (Java): [Seleziona]
mCurrentLatitude = gpsTracker.getLatitude();
mCurrentLongitude = gpsTracker.getLongitude();

Ma se volessi sapere (nella mia activity) esattamente quando le coordinate sono cambiate, come posso fare? Non so se ho reso l'idea, vorrei avere un "evento" nella mia activity che riprenda quello dell'oggetto GPSTracker.

Grazie in anticipo

Offline arlabs

  • Utente normale
  • ***
  • Post: 434
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS7
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Condividere oggetti tra activity
« Risposta #1 il: 23 Maggio 2014, 18:39:15 CEST »
+1
In generale per gestire oggetti il cuil lifecycle è quello dell'applicazione uso dei Singleton

Questo il pattern che genera AndroidStudio:

Codice (Java): [Seleziona]
public class Singleton{

    // Singleton instance
    private static SingletonourInstance = new Singleton();

    public static Singleton getInstance() {
        return ourInstance;
    }


Per passare eventi all'utilizzatore il modo che uso di solito è tramite callback.

Codice (Java): [Seleziona]
    public interface UpdateListener
    {
        void onUpdate(Status status);
    }

    private WeakReference<UpdateListener> mUpdateListener;

    public void setListener( final UpdateListener listener )
    {
        mUpdateListener = new WeakReference<UpdateListener>( listener );
    }

    private void notifyUpdate( Status status )
    {
        UpdateListener updateListener = mUpdateListener.get();
        if( updateListener != null )
            updateListener.onUpdate(mCurrentStatus);
    }

L'utilizzatore può implementare l'UpdateListener e registrarsi.
Codice (Java): [Seleziona]
        Singleton.getInstance().setListener( new Singleton.UpdateListener() {
            @Override
            public void onUpdate(Singleton.Status status) {
               
            }
        });

Uso questo approccio perché non mi vincola ad avere un Looper (e quindi un Activity) per usare l'oggetto.
Questo funziona bene se tutto lavora nel thread principale. Se usi diversi thread è meglio mandare eventi al Looper (quello principale della UI) usando un Handler.

Nel caso specifico del LocationListener i tuo eventi sono già chiamati nel thread principale e quindi non ci sono problemi.

Ciao.