Autore Topic: temporizzazione  (Letto 1204 volte)

Offline rocco_fun90

  • Utente junior
  • **
  • Post: 61
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s3
  • Sistema operativo:
    Windows xp
temporizzazione
« il: 28 Gennaio 2013, 09:09:46 CET »
0
Buongiorno a tutti, sto realizzando una app che mi dovrebbe inviare ad intervalli regolari ad esempio 30 secondi una posizione, il  mio problema è come fare questa temporizzazione?
Inoltre è possibile temporizzare la app, anche se è chiusa?
Grazie a tutti coloro che mi risponderanno.

Offline rocco_fun90

  • Utente junior
  • **
  • Post: 61
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s3
  • Sistema operativo:
    Windows xp
Re:temporizzazione
« Risposta #1 il: 28 Gennaio 2013, 09:15:20 CET »
0
Ah dimenticavo di dire che vorrei che questa temporizzazione la facesse una funzione che viene richiamata nell'oncreate ma che cmq permette all'utente di utilizzare la app. L'invio delle posizione deve avvenire quindi in background senza che l'utente se ne accorga utilizzando la app).
Garzie ancora

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:temporizzazione
« Risposta #2 il: 28 Gennaio 2013, 10:05:27 CET »
0
Metti il tuo codice in un IntentService e schedulane l'esecuzione tramite la classe AlarmManager.
Se cerchi sul forum ci sono un po' di esempi :)

PS: Riduci al minimo la frequenza con cui esegui il tutto altrimenti addio batteria ;)

Offline rocco_fun90

  • Utente junior
  • **
  • Post: 61
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s3
  • Sistema operativo:
    Windows xp
Re:temporizzazione
« Risposta #3 il: 28 Gennaio 2013, 10:44:53 CET »
0
grazie.

Offline rocco_fun90

  • Utente junior
  • **
  • Post: 61
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s3
  • Sistema operativo:
    Windows xp
Re:temporizzazione
« Risposta #4 il: 29 Gennaio 2013, 11:23:57 CET »
0
Ragazzi ho provato ad aggiungere nella mia classe il codice seguente
Codice (Java): [Seleziona]
private class PositionThread extends Thread {
                  private Handler handler;
                  private int i = 0;
                  public PositionThread(Handler handler) {
                    this.handler = handler;
                  }
                  public void run() {
                    try {
                      while(true)
                      {                        
                                String[] stringaSplittataPosizioneIniziale= posizioneInizialeUtente.split("/");
                                Double lat0=0.0;
                                Double lon0 =0.0;
                                String provider0="";
                                Double precisione0=0.0;
                                if(stringaSplittataPosizioneIniziale.length==4)
                                {
                                        lat0=Double.parseDouble(stringaSplittataPosizioneIniziale[0]);
                                        lon0=Double.parseDouble(stringaSplittataPosizioneIniziale[1]);
                                        provider0=stringaSplittataPosizioneIniziale[2];
                                        precisione0=Double.parseDouble(stringaSplittataPosizioneIniziale[3]);
                                }
                               
                                String nuovaPosizioneUtente=dammiPosizione();
                                String[] stringaSplittataNuovaPosizione= nuovaPosizioneUtente.split("/");
                                Double lat1=0.0;
                                Double lon1=0.0;
                                String provider1="";
                                Double precisione1=0.0;
                                if(stringaSplittataNuovaPosizione.length==4)
                                {
                                        lat1=Double.parseDouble(stringaSplittataNuovaPosizione[0]);
                                        lon1=Double.parseDouble(stringaSplittataNuovaPosizione[1]);
                                        provider1=stringaSplittataNuovaPosizione[2];
                                        precisione1=Double.parseDouble(stringaSplittataNuovaPosizione[3]);
                                }                              
                                double distanzaMetri=CalculateDistanceInMeters(lat0, lon0, lat1, lon1);
                                double errore=precisione1;
                                if(distanzaMetri>(errore*fattoreSpostamento))
                                {
                                        //aggiorno la posizione da confrontare e notifico il messaggio
                                        posizioneInizialeUtente=nuovaPosizioneUtente;
                                        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
                                        dateFormat.setTimeZone(new SimpleTimeZone(SimpleTimeZone.UTC_TIME, "UTC"));
                                        Calendar cal = Calendar.getInstance();
                                        String dataRicezionePosizione=dateFormat.format(cal.getTime());
                                        ServerUtilities.salvaPosizioneAttuale(GCMRegistrar.getRegistrationId(context), lat1.toString(), lon1.toString(), dataRicezionePosizione, "3", provider1, precisione1.toString());        
                                        locationDB.insertLocation(db, lat1.toString(), lon1.toString(), provider1, precisione1.toString());
                                        notifyMessage(nuovaPosizioneUtente);//scrive la poszione sul server
                                }              
                                Thread.sleep(positionFrequency);//fermo 2 minuti                               
                      }
                    }catch(InterruptedException ex) {}
                  }

                  /* Nel metodo notifyMessage() settiamo nell'oggetto Bundle il messaggio contenuto nella stringa str
                   * e la identifichiamo con la stringa 'refresh'. Quest'ultima diciamo che rappresenta il comando con
                   * cui si identifica un'azione. Questo è importante poichè in situazioni dove si devono gestire logiche
                   * un po più complesse è conveniente definire un protocollo ad hoc di comandi dove a ciascuno è
                   * associata un'azione.*/

                  private void notifyMessage(String str) {
                    Message msg = handler.obtainMessage();
                    Bundle b = new Bundle();
                    b.putString("refresh", ""+str);
                    msg.setData(b);
                    handler.sendMessage(msg);
                  }
                }
       
        private class MyHandler extends Handler {
                /*Il metodo handleMessage() viene invocato ogni qualvolta il nostro thread invia un messaggio. Quindi
                 * estrae il Bundle dall'oggetto Message verifica che sia presente la chiave 'refresh' e ne estrae il
                 * valore.*/

            @Override
            public void handleMessage(Message msg) {
              Bundle bundle = msg.getData();
              if(bundle.containsKey("refresh")) {
                String position  = bundle.getString("refresh");
                Log.d("DEBUG ", position);           
              }
            }
          }
       
        //calcola la distanza in metri tra due coordinate geografiche
        private double CalculateDistanceInMeters(double lat1, double lon1, double lat2, double lon2)
        {
            //Authalic radius in km http://en.wikipedia.org/wiki/Earth_radius
            double rad = 6371.0072; //Earth radius in Km

            //Convert to radians
            double p1X = lat1 / 180 * Math.PI;
            double p1Y = lon1 / 180 * Math.PI;
            double p2X = lat2 / 180 * Math.PI;
            double p2Y = lon2 / 180 * Math.PI;

            return Math.acos(Math.sin(p1Y) * Math.sin(p2Y) + Math.cos(p1Y) * Math.cos(p2Y) * Math.cos(p2X - p1X)) * rad * 1000;
        }

ovviamente nell'oncreate ho avviato il thread, il problema è che io voglio che questo thread viene eseguito anche se l'applicazione è chiusa, ed ovviamente anche le variabili che uso le riconosca anche al di fuori della app.
Ho notato debuggando che il thread viene eseguito al di fuori della app ma le variabili sono vuote (quelle inizializzate nell'on create)
Come faccio?

Offline rocco_fun90

  • Utente junior
  • **
  • Post: 61
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s3
  • Sistema operativo:
    Windows xp
Re:temporizzazione
« Risposta #5 il: 29 Gennaio 2013, 12:08:25 CET »
0
Ho notato che è la funzione dammiPosizione() che mi porta alla seguente eccezione nel logCat
Codice: [Seleziona]
01-29 12:05:18.430: E/AndroidRuntime(2392): FATAL EXCEPTION: Thread-1797
01-29 12:05:18.430: E/AndroidRuntime(2392): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
01-29 12:05:18.430: E/AndroidRuntime(2392):         at android.os.Handler.<init>(Handler.java:121)
01-29 12:05:18.430: E/AndroidRuntime(2392):         at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:183)
01-29 12:05:18.430: E/AndroidRuntime(2392):         at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:183)
01-29 12:05:18.430: E/AndroidRuntime(2392):         at android.location.LocationManager._requestLocationUpdates(LocationManager.java:661)
01-29 12:05:18.430: E/AndroidRuntime(2392):         at android.location.LocationManager.requestLocationUpdates(LocationManager.java:486)
01-29 12:05:18.430: E/AndroidRuntime(2392):         at com.androidhive.pushnotifications.MainActivity.dammiPosizione(MainActivity.java:521)
01-29 12:05:18.430: E/AndroidRuntime(2392):         at com.androidhive.pushnotifications.MainActivity.access$6(MainActivity.java:489)
01-29 12:05:18.430: E/AndroidRuntime(2392):         at com.androidhive.pushnotifications.MainActivity$PositionThread.run(MainActivity.java:730)
.
In pratica la funzione dammiPosizione è così definita
Codice (Java): [Seleziona]
        private String dammiPosizione(){
                String posizione="";
                LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
                //di default il providerID è GPSProvider
                LocationProvider provider = locationManager.getProvider(providerId);
                //SE IL GPS NON è DISPONIBILE UTILIZZO LA RETE
                if (provider == null) {
                                providerId= LocationManager.NETWORK_PROVIDER;
                                provider = locationManager.getProvider(providerId);
                                if (provider == null) {
                                        //provider non disponibile
                                        return posizione;//ritorno una posizione vuota
                                }
                                else
                                {
                                        Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                                        if (location != null) {
                                                //richiamo il metodo definito sotto
                                                posizione=updateLocationData(location);
                                        }
                                        locationManager.requestLocationUpdates(providerId, 5, 1, myLocationListener);
                                }
                } else
                {
                               
                                boolean gpsEnabled = locationManager.isProviderEnabled(providerId);
                                if (gpsEnabled) {
                                        Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                                        if (location != null) {
                                                //richiamo il metodo definito sotto
                                                posizione=updateLocationData(location);
                                        }
                                        locationManager.requestLocationUpdates(providerId, 5, 1, myLocationListener);
                                } else {
                                        providerId= LocationManager.NETWORK_PROVIDER;
                                        provider = locationManager.getProvider(providerId);
                                        if (provider == null) {
                                                //provider non disponibile
                                                return posizione;//ritorno una posizione vuota
                                        }
                                        else
                                        {
                                                Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                                                if (location != null) {
                                                        //richiamo il metodo definito sotto
                                                        posizione=updateLocationData(location);
                                                }
                                                locationManager.requestLocationUpdates(providerId, 5, 1, myLocationListener);
                                        }
                                }
                               
                }
                providerId=LocationManager.GPS_PROVIDER;//resetto il provider di dafault
                return posizione;
        }      
       
        private String updateLocationData(Location location)
        {
                //Date timestamp = new Date(location.getTime());
                double latitude = location.getLatitude();              
                double longitude = location.getLongitude();
                return /*timestamp+" "+*/latitude+"/"+longitude+"/"+location.getProvider()+"/"+location.getAccuracy();
        }