Autore Topic: [Location] Problema Timertask  (Letto 2654 volte)

Offline max246

  • Utente junior
  • **
  • Post: 73
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    G1
  • Play Store ID:
    Christian
[Location] Problema Timertask
« il: 11 Ottobre 2010, 19:22:42 CEST »
0
Voglio avviare un timertask che ogni tot minuti ricerca dove mi trovo e lo salvo in un  SharedPreferences, però ho trovato diverse difficolta...

Per prima cosa il SharedPreferences l'ho dovuto dichiararlo fuori e passarlo come riferimento quando creo il Timer, pure per il location.

Ora il getAppicationcontext mi da rogne... ho provato a metterci il context davanti ma niente.
Come faccio a farlo funzionare senza fare troppi pasticci?

Codice (Java): [Seleziona]
class UpdateTimeTask extends TimerTask {
    SharedPreferences prefs;
    LocationManager locationManager;

    UpdateTimeTask(SharedPreferences prefs,LocationManager locationManager) {
         this.prefs = prefs;
         this.locationManager  = locationManager;
    }
    @Override
    public void run() {
       
        SharedPreferences.Editor editor = prefs.edit();
         locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

        editor.putString("tm_location", null);
        editor.commit();
        System.out.println("Passo");
        //Inserire il codice per la localizzazione
    }
     LocationListener locationListener = new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                //     EditText et = (EditText) findViewById(R.id.segnala_dove);
                     if (location != null) {
                        // Aggiorna la location
                        Double geoLat = location.getLatitude();
                        Double geoLng = location.getLongitude();
                        Geocoder gc = new Geocoder(getApplicationContext(), Locale.getDefault());
                         try {
                                      List<Address> addresses = gc.getFromLocation(geoLat, geoLng, 3);
                                      StringBuilder sb = new StringBuilder();
                                      for (int x = 0;x < addresses.size();x++) {
                                          Address address = addresses.get(x);
                                          et.setText(address.getLocality());
                                      }
                                    } catch (IOException e) {}

                    } else {
                                    //No location found
                        et.setText("Nessuna localita");
                    }
                }

        public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        public void onProviderEnabled(String arg0) {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        public void onProviderDisabled(String arg0) {
            throw new UnsupportedOperationException("Not supported yet.");
        }
    };





}

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:[Location] Problema Timertask
« Risposta #1 il: 12 Ottobre 2010, 09:53:43 CEST »
0
getApplicationContext() è un metodo dell'Activity, per cui non lo trovi all'interno del tuo TimerTask.
Potresti passare il context nel costruttore, in modo da averlo.

Quando dici che ti da rogne, credo tu indenda dire proprio questo.

Un consiglio: quando hai problemi, oltre a spiegare cosa fai, dovresti pure segnalare nello specifico il tipo di problema riscontrato (errore di compilazione, di runtime, etc...).
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline max246

  • Utente junior
  • **
  • Post: 73
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    G1
  • Play Store ID:
    Christian
Re:[Location] Problema Timertask
« Risposta #2 il: 12 Ottobre 2010, 11:15:49 CEST »
0
ma perciò non è che sto facendo un casino assurdo? Cioè forse c'è un metodo piu semplice e moltio piu pulito per queste cose...

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:[Location] Problema Timertask
« Risposta #3 il: 12 Ottobre 2010, 11:47:46 CEST »
0
Per le shared Preferences, ti consiglio il tutorial di JD: http://www.anddev.it/index.php?topic=34.0

Ad ogni modo, se passi unicamente il context nel costruttore del tuo timerTask, non hai bisogno di tirarti dietro alcun altro dato, poiché sia le sharedPreferences che il locationManager sono accessibili dal context.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline max246

  • Utente junior
  • **
  • Post: 73
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    G1
  • Play Store ID:
    Christian
Re:[Location] Problema Timertask
« Risposta #4 il: 15 Ottobre 2010, 18:50:57 CEST »
0
Ok ora sono di nuovo fermo...

Ho passato il context e fin qua nessun problema, ora quando lo eseguo parte ma quando entra nel metodo run va in crash.

Codice: [Seleziona]
E/AndroidRuntime(  545): FATAL EXCEPTION: Timer-0
E/AndroidRuntime(  545): java.lang.UnsupportedOperationException: Not supported yet.
E/AndroidRuntime(  545):     at org.me.androidapplication6.UpdateTimeTask$1.onProviderDisabled(MainActivity.java:382)
E/AndroidRuntime(  545):     at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:204)
E/AndroidRuntime(  545):     at android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:124)
E/AndroidRuntime(  545):     at android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.java:140)
E/AndroidRuntime(  545):     at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(  545):     at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(  545):     at org.me.androidapplication6.UpdateTimeTask.run(MainActivity.java:342)
E/AndroidRuntime(  545):     at java.util.Timer$TimerImpl.run(Timer.java:289)
W/ActivityManager(   63):   Force finishing activity org.me.androidapplication6/.MainActivity

Codice (Java): [Seleziona]
class UpdateTimeTask extends TimerTask {
 
    SharedPreferences prefs;
    LocationManager locationManager;
    Context context;

    UpdateTimeTask(Context context) {
        this.prefs = context.getSharedPreferences("tm_setting", Context.MODE_WORLD_READABLE);
        this.locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    }

    @Override
    public void run() {
        Looper.prepare();
       
        SharedPreferences.Editor editor = prefs.edit();
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

        editor.putString("tm_location", null);
        editor.commit();
        System.out.println("Passo");
        //Inserire il codice per la localizzazione
       
        Looper.loop();

    }
    LocationListener locationListener = new LocationListener() {

        @Override
        public void onLocationChanged(Location location) {
            //     EditText et = (EditText) findViewById(R.id.segnala_dove);
            if (location != null) {
                // Aggiorna la location
                Double geoLat = location.getLatitude();
                Double geoLng = location.getLongitude();
                Geocoder gc = new Geocoder(context, Locale.getDefault());
                try {
                    List<Address> addresses = gc.getFromLocation(geoLat, geoLng, 3);
                    StringBuilder sb = new StringBuilder();
                    for (int x = 0; x < addresses.size(); x++) {
                        Address address = addresses.get(x);
                        System.out.println(address.getLocality());
                        //et.setText(address.getLocality());
                    }
                } catch (IOException e) {
                }

            } else {
                //No location found
                System.out.println("Nessuna");
                // et.setText("Nessuna localita");
            }
        }

        public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        public void onProviderEnabled(String arg0) {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        public void onProviderDisabled(String arg0) {
            throw new UnsupportedOperationException("Not supported yet.");
        }
    };
}

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:[Location] Problema Timertask
« Risposta #5 il: 15 Ottobre 2010, 20:38:14 CEST »
0
Scusa ma sei conscio del codice che scrivi? L'eccezione che ti viene sollevata l'hai scritta tu eh!  o_O o_O

Offline max246

  • Utente junior
  • **
  • Post: 73
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    G1
  • Play Store ID:
    Christian
Re:[Location] Problema Timertask
« Risposta #6 il: 15 Ottobre 2010, 21:36:12 CEST »
0
Allora, ho scritto il codice poi nel run ( parte dove viene richiamato ogni volta che il thread si avvia ) , deve cercare di trovare dove sono.
Il programma mi ha ritornato un errore dove mi diceva che dovevo usare dei Looper ( non so cosa sono, non ho mai visto in java questo metodo ). Allora tramite il sito ho applicato questo Looper | Android Developers

Ora non capisco come risolvere... cioè boh!
Io voglio solo che mi faccia partire questo locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

Pero non me lo lascia, questo è l'errore senza looper:

Codice: [Seleziona]
E/AndroidRuntime( 1455): FATAL EXCEPTION: Timer-0
E/AndroidRuntime( 1455): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
E/AndroidRuntime( 1455):     at android.os.Handler.<init>(Handler.java:121)
E/AndroidRuntime( 1455):     at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:139)
E/AndroidRuntime( 1455):     at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:137)
E/AndroidRuntime( 1455):     at android.location.LocationManager._requestLocationUpdates(LocationManager.java:708)
E/AndroidRuntime( 1455):     at android.location.LocationManager.requestLocationUpdates(LocationManager.java:630)
E/AndroidRuntime( 1455):     at org.me.androidapplication6.UpdateTimeTask.run(MainActivity.java:341)
E/AndroidRuntime( 1455):     at java.util.Timer$TimerImpl.run(Timer.java:289)
W/ActivityManager(   63):   Force finishing activity org.me.androidapplication6/.MainActivity

Offline max246

  • Utente junior
  • **
  • Post: 73
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    G1
  • Play Store ID:
    Christian
Re:[Location] Problema Timertask
« Risposta #7 il: 18 Ottobre 2010, 09:25:14 CEST »
0
help :( nessuno sa risolvere?
Oggi mi è venuto un dubbio, visto che attivo un location listener questa cosa non resta in background e si aggiorna in automatico?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:[Location] Problema Timertask
« Risposta #8 il: 18 Ottobre 2010, 09:40:14 CEST »
0
Pero non me lo lascia, questo è l'errore senza looper:

E con il Looper?

Offline max246

  • Utente junior
  • **
  • Post: 73
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    G1
  • Play Store ID:
    Christian
Re:[Location] Problema Timertask
« Risposta #9 il: 18 Ottobre 2010, 09:43:23 CEST »
0
E con il Looper?

Con il looper l'errore è nella Risposta #4

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:[Location] Problema Timertask
« Risposta #10 il: 18 Ottobre 2010, 09:46:09 CEST »
0
Ok allora per quelli ti ho già risposto, mi sembra in modo esaustivo. Sai a cosa serve la parola chiave throw in java? :)

Offline max246

  • Utente junior
  • **
  • Post: 73
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    G1
  • Play Store ID:
    Christian
Re:[Location] Problema Timertask
« Risposta #11 il: 18 Ottobre 2010, 09:57:09 CEST »
0
Ok allora per quelli ti ho già risposto, mi sembra in modo esaustivo. Sai a cosa serve la parola chiave throw in java? :)
Intedi dire che sul emulatore non funziona perchè non riesce a ricavare l'errore percio entra nelle exepction sotto? :P Sono così stupido? :D

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:[Location] Problema Timertask
« Risposta #12 il: 18 Ottobre 2010, 10:04:49 CEST »
0
Intedi dire che sul emulatore non funziona perchè non riesce a ricavare l'errore percio entra nelle exepction sotto? :P Sono così stupido? :D

Non sto dicendo quello. Sono cose che capitano copiando il codice da internet. Solo che quando si ha un'eccezione di solito si ha il numero di riga e una serie di informazioni percui si riesce a capire dove viene sollevata. Nel tuo caso dovevi proprio notare che veniva sollevata da una throw che chi ha scritto il codice ha piazzato li.

Offline max246

  • Utente junior
  • **
  • Post: 73
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    G1
  • Play Store ID:
    Christian
Re:[Location] Problema Timertask
« Risposta #13 il: 18 Ottobre 2010, 12:23:56 CEST »
0
Non sto dicendo quello. Sono cose che capitano copiando il codice da internet. Solo che quando si ha un'eccezione di solito si ha il numero di riga e una serie di informazioni percui si riesce a capire dove viene sollevata. Nel tuo caso dovevi proprio notare che veniva sollevata da una throw che chi ha scritto il codice ha piazzato li.

Me lo ha implementato netbenas :)

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:[Location] Problema Timertask
« Risposta #14 il: 18 Ottobre 2010, 12:33:47 CEST »
+1
Quello che Ricky vuole dirti è che, a prescindere di chi abbia messo lì quel pezzo di codice, rileggendolo si vede chiaramente che, nonostante sia un eccezione, è semplicemente un messaggio che indica che il programma sta funzionando ed è arrivato ad un punto in cui viene generata appunto l'eccezione.
Ma non è un'eccezione in quanto tale: il codice autogenerato da netbeans è messo lì perché prevede che l'utente lo modifichi o ne prenda coscienza.

Nel caso specifico:

Codice (Java): [Seleziona]
        public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        public void onProviderEnabled(String arg0) {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        public void onProviderDisabled(String arg0) {
            throw new UnsupportedOperationException("Not supported yet.");
        }

Se non implementi queste funzioni, avrai sempre queste eccezioni.
Nota: questo è un problema inerente Java, e non android.

Ti ho risposto solo per ricordarti che sarebbe un bene guardare il codice prima di postare un problema.
Solo se non si viene a capo, allora è il caso di consultare il forum.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/