Autore Topic: handler gps classe esterna  (Letto 795 volte)

Offline mambu

  • Utente normale
  • ***
  • Post: 167
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 7
handler gps classe esterna
« il: 07 Novembre 2011, 15:38:20 CET »
0
Salve, sto cercando di creare una classe esterna all'activity che mi permetta di ricavarmi la mia posizione gps peccato che si blocca all'istuzione:
Codice: [Seleziona]
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,        0, locationListener);ho messo l'istruzione in un try e l'errore che mi segnala lo stampo a log dandomi il seguente:
Codice: [Seleziona]
11-07 14:15:47.812: VERBOSE/inizio(1091): errorejava.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
qualc'uno sa come potrei risolvere? se sposto l'intero codice all'interno dell'activity il tutto funziona alla perfezione!

Offline theBaffo

  • Utente normale
  • ***
  • Post: 164
  • Respect: +24
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Windows 8.1
Re:handler gps classe esterna
« Risposta #1 il: 07 Novembre 2011, 16:00:17 CET »
0
Dovresti utilizzare una AsyncTask, operazioni "pesanti" come la tua vanno effettuate al di fuori della activity  ;-)

AsyncTask | Android Developers

questo è un tutorial che fà uso dell'asynctask:

http://www.anddev.it/index.php/topic,29.0.html
« Ultima modifica: 07 Novembre 2011, 16:03:01 CET da theBaffo, Reason: aggiunta tutorial da forum »
Se ti sono stato utile, premi "thanks" ;)

"Errare è umano, ma per incasinare davvero tutto è necessario un computer" - Arthur Bloch

Offline mambu

  • Utente normale
  • ***
  • Post: 167
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:handler gps classe esterna
« Risposta #2 il: 07 Novembre 2011, 16:39:46 CET »
0

mi spiace ma non funziona, ho piazzato spudoratamente il mio codice nel progettino che c'era in rete
questo è un tutorial che fà uso dell'asynctask:

http://www.anddev.it/index.php/topic,29.0.html
l'ho runnato ma ha dato sempre lo stesso errore..adesso sto guardando un po di comunicazioni activity + service, però mi sorge un dubbio non è proprio il gps che ha dei particolari problemi a essere eseguito in classi esterne?

Offline theBaffo

  • Utente normale
  • ***
  • Post: 164
  • Respect: +24
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Windows 8.1
Re:handler gps classe esterna
« Risposta #3 il: 07 Novembre 2011, 16:49:40 CET »
0
potresti postare un pò del tuo codice?
Se ti sono stato utile, premi "thanks" ;)

"Errare è umano, ma per incasinare davvero tutto è necessario un computer" - Arthur Bloch

Offline mambu

  • Utente normale
  • ***
  • Post: 167
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:handler gps classe esterna
« Risposta #4 il: 07 Novembre 2011, 16:57:38 CET »
0
dall'activity faccio partire un Thread che ospita la chiama alla mia classe che ha come parametro una variabile miaclasse che uso per passare l'ambiente activity:
Codice (Java): [Seleziona]
       
protected void onCreate(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onCreate(savedInstanceState);
                setContentView(R.layout.mcnmccgpsconn);
                miaClasse = this;
}

una volta chiamata il parametro potrò usarlo nella classe nella variabile classeUI
Codice (Java): [Seleziona]
LocationManager locationManager = (LocationManager) classeUI.getSystemService(Context.LOCATION_SERVICE);
//qua mi dà errore
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);

locationListener lo piazzo subito dopo:
Codice (Java): [Seleziona]
LocationListener locationListener = new LocationListener() {

                public void onLocationChanged(Location location) {
                        // Aggiorna il marker della mappa
                        Log.v("inizio", "viaaaa" + location.getLatitude());
}
altri metodi...
}
ma non arriva mai all'interno della funzione si ferma sempre prima perchè la requestLocationUpdates non va a buon fine

Offline mambu

  • Utente normale
  • ***
  • Post: 167
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:handler gps classe esterna
« Risposta #5 il: 14 Novembre 2011, 11:47:32 CET »
0
Visto che ancora io non sono riuscito a risolvere e l'ho chiesto più di una settimana fa, ripropongo il mio topic sperando che qualcuno mi riesca ad aiutare e soprattutto di non infrangere qualche regola del forum :-)

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:handler gps classe esterna
« Risposta #6 il: 14 Novembre 2011, 11:59:04 CET »
0
Con il metodo che descrivi non so come risolvere.

Io invece della classe, passerei il context. E' tutto quello che ti serve.

Una cosa del genere:

Codice (Java): [Seleziona]
public class miaClasseEsterna {
 Context mContext;
 public miaClasseEsterna (Context ctx){
       mContext = ctx;
  }

  public Location getLocation(){
   --
   locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);

   --
  }
}
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:handler gps classe esterna
« Risposta #7 il: 14 Novembre 2011, 12:07:48 CET »
0
Siccome anche con l'asyncTask non andava, potrebbe essere che tu stia cercando di "toccare" l'UI all'interno del thread. Proverei ad eliminare qualsiasi modifica dell'UI dal codice per vedere se funziona e, in caso contrario, posterei qui il codice di entrambe le classi, così possiamo avere un'idea di cosa fai.  ;-)

Il mio dubbio è che arrivi fino all'onLocationChanged() e lì si blocchi perché, aggiornando il marker, richiami all'esterno del "worker thread" il metodo "invalidate()" della mapview .
« Ultima modifica: 14 Novembre 2011, 12:12:35 CET da Verandi »

Offline mambu

  • Utente normale
  • ***
  • Post: 167
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:handler gps classe esterna
« Risposta #8 il: 14 Novembre 2011, 12:27:28 CET »
0
Con il metodo che descrivi non so come risolvere.

Io invece della classe, passerei il context. E' tutto quello che ti serve.

scusa ma pensavo che passandogli la mia classe avessi già in qualche modo il context, ho modificato così:
Codice (Java): [Seleziona]
prova=Context;
protected void onCreate(Bundle savedInstanceState) {
                ...
                prova=getApplicationContext();
                ...
        }
chiamando poi la mia classe in un thread appositamente creato:
Codice (Java): [Seleziona]
class gpsThread extends Thread {
                        public void run() {
                                try {
                                        gpsClass risultati = new gpsClass(prova);
                                        ..
                                } catch (Exception e) {
                                }
                        }
                }
                ..

nella classe chiamata avrò il costruttore che salva il context e poi fa la chiamata:
Codice (Java): [Seleziona]
public double GpsPosition() {
                LocationManager locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
try {
                locationManager.requestLocationUpdates(
                LocationManager.GPS_PROVIDER, 0, 0, locationListener);
                Log.v("", "fatto");
        } catch (Exception e) {
                        Log.v("inizio", "errore" + e);
        }
...
ma ancora da lo stesso errore
Siccome anche con l'asyncTask non andava, potrebbe essere che tu stia cercando di "toccare" l'UI all'interno del thread.
non mi sembra di toccare la UI onestamente faccio solo queste due funzioni e poi chiamo il metodo per ricavare la posizione:
Codice (Java): [Seleziona]
LocationListener locationListener = new LocationListener() {

                public void onLocationChanged(Location location) {
                        Log.v("inizio", "viaaaa" + location.getLatitude());
                       
                }
}
ma in quest'ultima non entra mai a causa dell'errore

Il mio dubbio è che arrivi fino all'onLocationChanged() e lì si blocchi perché, aggiornando il marker, richiami all'esterno del "worker thread" il metodo "invalidate()" della mapview .
come posso risolvere il tuo dubbio?

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:handler gps classe esterna
« Risposta #9 il: 14 Novembre 2011, 12:44:07 CET »
0
Dovresti postare tutto il codice completo , altrimenti non possiamo esserti d'aiuto.

Offline mambu

  • Utente normale
  • ***
  • Post: 167
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:handler gps classe esterna
« Risposta #10 il: 14 Novembre 2011, 14:32:35 CET »
0
non ho molto più da postare, comunque ho risolto facendo partire la classe esterna tramite questo thred implementato con il looper:
Codice (Java): [Seleziona]
class gpsThread extends Thread {
                    public void run() {
                        Looper.prepare();
                        risultati.GpsPosition();//chiamata al metdo desiderato
                        Looper.loop();
                    }
                }
:D :D