CERCA
PER MODELLO
FullScreen Chatbox! :)

Utente del giorno: 9mm con ben 3 Thanks ricevuti nelle ultime 24 ore
Utente della settimana: 9mm con ben 8 Thanks ricevuti negli ultimi sette giorni
Utente del mese: 9mm con ben 29 Thanks ricevuti nell'ultimo mese

Visualizzazione dei risultati da 1 a 6 su 6
Discussione:

GPS Listener per svegliare thread

Se questa discussione ti è stata utile, ti preghiamo di lasciare un messaggio di feedback in modo che possa essere preziosa in futuro anche per altri utenti come te!
  1. #1
    Baby Droid


    Registrato dal
    Nov 2010
    Messaggi
    8

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    GPS Listener per svegliare thread

    Ciao a tutti, ho questa necessità: ho un service attivo sul terminale android che scarica degli eventi da un webservice. Vorrei che gli eventi venissero scaricati periodicamente in seguito ad uno spostamento del terminale.
    Ho realizzato questo:
    codice:
    public void onCreate() {
       contentView = new RemoteViews(getPackageName(), R.layout.notification);
       manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
       lm = (LocationManager) getSystemService(LOCATION_SERVICE);
       lm1 = (LocationManager) getSystemService(LOCATION_SERVICE);
       usersettings = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
       lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, (long) 0, 0.0f, new GPSListener());
       Thread notifyingThread = new Thread(null, mainthread, "NotifyingService");
       Thread gpsNotificatorThread = new Thread(null, gpsthread, "NotifyingGPSChange");
       condvar = new ConditionVariable(false);
       condvargps = new ConditionVariable(false);
       downloadlock = new ConditionVariable(false);
       notifyingThread.start();
       gpsNotificatorThread.start();
    }
    dove creo due locationmanager (uno per un thread e uno per un altro)
    I due tread sono:
    codice:
    private Runnable gpsthread = new Runnable() {
       public void run() {
          Log.i(TAG, "gpsThread started");
          while (true) {
             int mindist = Integer.parseInt(usersettings.getString("queryperiod", "100"));
        	 lm1.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, (float)mindist, 
                new LocationListener() {
                   @Override
                   public void onLocationChanged(Location location) {
                      Log.i(TAG, "Location changed beyond the min distance");
                      condvargps.open();
                   }
                });
             }
          }
       };
    e
    codice:
    private Runnable mainthread = new Runnable() {
       public void run() {
          while (true){
             // get preference on query period, return default 5 min if not set
             //int delay = Integer.parseInt(usersettings.getString("queryperiod", "300")) * 1000;
             int delay = Integer.parseInt(usersettings.getString("queryperiod", "100"));
             if (delay == 0) {
                Log.i(TAG, "Thread blocked for 60000 millis");
                condvar.block(60000); 
                continue;
             }
             Log.i(TAG, "distance query is "+delay+" mt");
             condvargps.block();
             ...
             ...
    e successivamente mi scarica gli eventi.

    Ho creato il thread mainthread che si blocca. Posso scegliere la distanza minima di refresh degli eventi, se è zero si blocca subito per 60000 millis, altrimenti si blocca subito dopo e resta in attesa che il thread gpsthread faccia l'open() sulla ConditionVariable.

    Il codice non mi da errore, ma quando lo faccio partire, mi restituisce una eccezione:
    codice:
    ERROR/AndroidRuntime(495): FATAL EXCEPTION: NotifyingGPSChange
    ERROR/AndroidRuntime(495): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
    ERROR/AndroidRuntime(495):     at android.os.Handler.<init>(Handler.java:121)
    ERROR/AndroidRuntime(495):     at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:139)
    ERROR/AndroidRuntime(495):     at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:137)
    ERROR/AndroidRuntime(495):     at android.location.LocationManager._requestLocationUpdates(LocationManager.java:708)
    ERROR/AndroidRuntime(495):     at android.location.LocationManager.requestLocationUpdates(LocationManager.java:630)
    ERROR/AndroidRuntime(495):     at com.thesisug.notification.TaskNotification$1.run(TaskNotification.java:90)
    ERROR/AndroidRuntime(495):     at java.lang.Thread.run(Thread.java:1096)
    la riga 90 del TaskNotificator è questa:
    codice:
    lm1.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, (float)mindist, new LocationListener() {
    con l'implementazione del LocationListener.

    Cosa può essere? Cos'è che sbaglio? E' la prima volta che faccio una cosa del genere e vorrei imparare cosa c'è che non va...Eventualmente come può essere risolto questo problema? C'è un metodo più veloce piuttosto che creare un thread che me ne risveglia un altro?

    grazie a tutti

    Alessio

  2.  
  3. #2
    Baby Droid


    Registrato dal
    Nov 2010
    Messaggi
    35

    Ringraziamenti
    1
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Quote Originariamente inviato da snieco Visualizza il messaggio
    Ciao a tutti, ho questa necessità: ho un service attivo sul terminale android che scarica degli eventi da un webservice. Vorrei che gli eventi venissero scaricati periodicamente in seguito ad uno spostamento del terminale.
    Ho realizzato questo:
    codice:
    public void onCreate() {
       contentView = new RemoteViews(getPackageName(), R.layout.notification);
       manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
       lm = (LocationManager) getSystemService(LOCATION_SERVICE);
       lm1 = (LocationManager) getSystemService(LOCATION_SERVICE);
       usersettings = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
       lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, (long) 0, 0.0f, new GPSListener());
       Thread notifyingThread = new Thread(null, mainthread, "NotifyingService");
       Thread gpsNotificatorThread = new Thread(null, gpsthread, "NotifyingGPSChange");
       condvar = new ConditionVariable(false);
       condvargps = new ConditionVariable(false);
       downloadlock = new ConditionVariable(false);
       notifyingThread.start();
       gpsNotificatorThread.start();
    }
    dove creo due locationmanager (uno per un thread e uno per un altro)
    I due tread sono:
    codice:
    private Runnable gpsthread = new Runnable() {
       public void run() {
          Log.i(TAG, "gpsThread started");
          while (true) {
             int mindist = Integer.parseInt(usersettings.getString("queryperiod", "100"));
        	 lm1.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, (float)mindist, 
                new LocationListener() {
                   @Override
                   public void onLocationChanged(Location location) {
                      Log.i(TAG, "Location changed beyond the min distance");
                      condvargps.open();
                   }
                });
             }
          }
       };
    e
    codice:
    private Runnable mainthread = new Runnable() {
       public void run() {
          while (true){
             // get preference on query period, return default 5 min if not set
             //int delay = Integer.parseInt(usersettings.getString("queryperiod", "300")) * 1000;
             int delay = Integer.parseInt(usersettings.getString("queryperiod", "100"));
             if (delay == 0) {
                Log.i(TAG, "Thread blocked for 60000 millis");
                condvar.block(60000); 
                continue;
             }
             Log.i(TAG, "distance query is "+delay+" mt");
             condvargps.block();
             ...
             ...
    e successivamente mi scarica gli eventi.

    Ho creato il thread mainthread che si blocca. Posso scegliere la distanza minima di refresh degli eventi, se è zero si blocca subito per 60000 millis, altrimenti si blocca subito dopo e resta in attesa che il thread gpsthread faccia l'open() sulla ConditionVariable.

    Il codice non mi da errore, ma quando lo faccio partire, mi restituisce una eccezione:
    codice:
    ERROR/AndroidRuntime(495): FATAL EXCEPTION: NotifyingGPSChange
    ERROR/AndroidRuntime(495): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
    ERROR/AndroidRuntime(495):     at android.os.Handler.<init>(Handler.java:121)
    ERROR/AndroidRuntime(495):     at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:139)
    ERROR/AndroidRuntime(495):     at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:137)
    ERROR/AndroidRuntime(495):     at android.location.LocationManager._requestLocationUpdates(LocationManager.java:708)
    ERROR/AndroidRuntime(495):     at android.location.LocationManager.requestLocationUpdates(LocationManager.java:630)
    ERROR/AndroidRuntime(495):     at com.thesisug.notification.TaskNotification$1.run(TaskNotification.java:90)
    ERROR/AndroidRuntime(495):     at java.lang.Thread.run(Thread.java:1096)
    la riga 90 del TaskNotificator è questa:
    codice:
    lm1.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, (float)mindist, new LocationListener() {
    con l'implementazione del LocationListener.

    Cosa può essere? Cos'è che sbaglio? E' la prima volta che faccio una cosa del genere e vorrei imparare cosa c'è che non va...Eventualmente come può essere risolto questo problema? C'è un metodo più veloce piuttosto che creare un thread che me ne risveglia un altro?

    grazie a tutti

    Alessio
    Una domanda, ti entra nel locationchanged facendo così?
    Quell'errore dovrebbe essere dovuto alla mancanza della riga Looper.prepare();
    A quanto pare ogni thread deve avere un looper associato e con quell'istruzione ne istanzi uno..

  4. #3
    Baby Droid


    Registrato dal
    Nov 2010
    Messaggi
    8

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Quote Originariamente inviato da Brucio82 Visualizza il messaggio
    Una domanda, ti entra nel locationchanged facendo così?
    Quell'errore dovrebbe essere dovuto alla mancanza della riga Looper.prepare();
    A quanto pare ogni thread deve avere un looper associato e con quell'istruzione ne istanzi uno..
    Innanzitutto grazie per la risposta!
    Da log, generando l'eccezione quando inizializzo il requestLocationUpdate non mi entra mai nel locationchanged!

    Il Looper cos'è di preciso? Un semplice looper che mi cicla le istruzioni del thread? Della serie, è sostituibile al mio while(true) nel run del thread?

    Grazie

    Alessio

  5. #4
    Baby Droid


    Registrato dal
    Nov 2010
    Messaggi
    8

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Quote Originariamente inviato da snieco Visualizza il messaggio
    Il Looper cos'è di preciso? Un semplice looper che mi cicla le istruzioni del thread? Della serie, è sostituibile al mio while(true) nel run del thread?
    Forse ho detto una eresia... Ma a cosa serve questo Looper? Non riesco a capirlo!

    Ciaooo

    Alessio

  6. #5
    Baby Droid


    Registrato dal
    Nov 2010
    Messaggi
    35

    Ringraziamenti
    1
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Il looper, a quanto dice l'help android, esegue un messaggio di loop per un thread; l'esempio fornito è questo:
    class LooperThread extends Thread {
    public Handler mHandler;
    public void run() {
    Looper.prepare();
    mHandler = new Handler() {
    public void handleMessage(Message msg) {
    // process incoming messages } };
    Looper.loop(); } }

    Non ne ho appreso a pieno il significato, ho solo capito che lo vuole....Mi sono imbattuto nel tuo identico problema, ma è poca la gente che ne parla...se sai qualcosa fai sapere anche a me?!?!?!

  7. #6
    Baby Droid


    Registrato dal
    Nov 2010
    Messaggi
    8

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Quote Originariamente inviato da Brucio82 Visualizza il messaggio
    Il looper, a quanto dice l'help android, esegue un messaggio di loop per un thread; l'esempio fornito è questo:
    class LooperThread extends Thread {
    public Handler mHandler;
    public void run() {
    Looper.prepare();
    mHandler = new Handler() {
    public void handleMessage(Message msg) {
    // process incoming messages } };
    Looper.loop(); } }

    Non ne ho appreso a pieno il significato, ho solo capito che lo vuole....Mi sono imbattuto nel tuo identico problema, ma è poca la gente che ne parla...se sai qualcosa fai sapere anche a me?!?!?!
    Purtroppo sono abbastanza in acqua alta anche io!
    Comunque ho risolto (in modo estremamente poco elegante) aggiungendo all'inizio del metodo run() la riga Looper.prepare().
    A quanto ho capito dall'help di android si tratta di un modo per permettere all'Handler di gestire eventuali messaggi che gli dovessero arrivare. Utilizzando la dichiarazione del loop, si può fare a meno di gestire gli Handler per i thread che non ne fanno uso...
    Non saprei che utilizzo specifico se ne possa fare...

    Vabbè, se ti può interessare io ho risolto così:

    ed ho creato poi

    che è sostanzialmente come avevo fatto prima. Ora mi è sorto un altro problema, il thread che creo in questo modo cicla all'infinito sul while(true), perciò mi impegna il terminale a mille! Quindi sto provvedendo adaggiugere un controllo che blocca il thread per una quantità di tempo variabile in base alla velicità del terminale stesso! Cioè blocco il thread per un intervallo di tempo che si adatta automaticamente in base alla velocità e controllo (tramite il requestLocationUpdate) se la posizione è andata oltre alla mia distanza minima o meno ed in caso positivo rilascio l'altro thread che mi effettua il download degli eventi dal server.

    Non è proprio quello che volevo realizzare, ma non saprei come fare altrimenti! Il topo sarebbe stato che, ad ogni spostamento peri alla distanza minima impostata, il terminale fa il download. Come indicato sopra invece il terminale fa il download ad intervalli di tempo regolari (più grandi al variare della velocità e della distanza minima) solo se effettivamente la distanza coperta è superiore alla distanza minima!

    Ciao e grazie

    Alessio

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire risposte
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Torna su
Privacy Policy