Autore Topic: asynctask per posizione gps  (Letto 819 volte)

Offline tafazzi87

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Google nexus 7 - acer E330
  • Sistema operativo:
    Ubuntu 12.04 - Mac OS X 10.6.8
asynctask per posizione gps
« il: 19 Novembre 2013, 18:11:30 CET »
0
ragazzi io ho letto un po' e provato a capire questi asynctask.
Praticamente a me servirebbe che ci sia un task che cerchi la posizione gps e poi chiuda il task e dia come risultato un LatLng con le coordinate della posizione. eh io ho fatto una cosa del genere:
Codice (Java): [Seleziona]
public class MainActivity extends Activity {
        Gps s;
        LatLng adesso;
        private ProgressBar rotazione;
        private GpsTask gps;
        TextView attendi;
        public class GpsTask extends AsyncTask<Gps, Void, LatLng>{
                protected void onPreExecute(){
                        rotazione.setVisibility(View.VISIBLE);
                }
                @Override
                protected LatLng doInBackground(Gps... params) {
                        // TODO Auto-generated method stub
                        s.getLocation();
                        adesso=new LatLng(s.latitudine(), s.longitudine());
                        return adesso;
                }
                protected void onPostExecute(final Void unused){
                       
                        rotazione.setVisibility(View.GONE);
                        attendi.setText("Posizione trovata");
                }
        }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final Activity a=this;
        s=new Gps(getApplicationContext());
        gps=new GpsTask();
        rotazione=(ProgressBar)findViewById(R.id.progressBar1);
        rotazione.setVisibility(View.GONE);
        Button bottone_libretto=(Button)findViewById(R.id.button_libretto);
        Button bottone_fermata=(Button)findViewById(R.id.button_fermata);
        Button bottone_statistiche=(Button)findViewById(R.id.button_statistiche);
        attendi=(TextView)findViewById(R.id.attendi);
        gps.execute();
vabè poi dopo c'è il codice per aprire altre activity con ogni bottone etc etc comunque l'activity parte e aggancia il segnale gps e prende la posizione però quando prende la posizione non si ferma il progressbar e non va quindi nell'onPostExecute.
Ho provato a mettere all'interno del mainactivity
Codice (Java): [Seleziona]
if(adesso.latitude!=0 && adesso.longitude!=0)
       gps.cancel(true);
ma in questo modo non funziona l'app crasha subito e mi da questo errore:
Codice: [Seleziona]
11-19 18:09:32.624: E/AndroidRuntime(17005): FATAL EXCEPTION: main
11-19 18:09:32.624: E/AndroidRuntime(17005): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.pullmanperugia/com.example.pullmanperugia.MainActivity}: java.lang.NullPointerException
11-19 18:09:32.624: E/AndroidRuntime(17005):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
11-19 18:09:32.624: E/AndroidRuntime(17005):         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
11-19 18:09:32.624: E/AndroidRuntime(17005):         at android.app.ActivityThread.access$600(ActivityThread.java:141)
11-19 18:09:32.624: E/AndroidRuntime(17005):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
11-19 18:09:32.624: E/AndroidRuntime(17005):         at android.os.Handler.dispatchMessage(Handler.java:99)
11-19 18:09:32.624: E/AndroidRuntime(17005):         at android.os.Looper.loop(Looper.java:137)
11-19 18:09:32.624: E/AndroidRuntime(17005):         at android.app.ActivityThread.main(ActivityThread.java:5103)
11-19 18:09:32.624: E/AndroidRuntime(17005):         at java.lang.reflect.Method.invokeNative(Native Method)
11-19 18:09:32.624: E/AndroidRuntime(17005):         at java.lang.reflect.Method.invoke(Method.java:525)
11-19 18:09:32.624: E/AndroidRuntime(17005):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
11-19 18:09:32.624: E/AndroidRuntime(17005):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-19 18:09:32.624: E/AndroidRuntime(17005):         at dalvik.system.NativeStart.main(Native Method)
11-19 18:09:32.624: E/AndroidRuntime(17005): Caused by: java.lang.NullPointerException
11-19 18:09:32.624: E/AndroidRuntime(17005):         at com.example.pullmanperugia.MainActivity.onCreate(MainActivity.java:54)
11-19 18:09:32.624: E/AndroidRuntime(17005):         at android.app.Activity.performCreate(Activity.java:5133)
11-19 18:09:32.624: E/AndroidRuntime(17005):         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
11-19 18:09:32.624: E/AndroidRuntime(17005):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
11-19 18:09:32.624: E/AndroidRuntime(17005):         ... 11 more
come devo fare?potete spiegare come passa al onPostExecute???
grazie
P.S. allego anche il codice per la classe Gps
Codice (Java): [Seleziona]
package com.example.esempio;

import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;

//Classe per collegarsi col modulo gps e registrare la posizione
public class Gps implements LocationListener {
        Context myContext;
        Location posizione;
        double latitudine,longitudine;
        LocationManager locationManager;
        //Costruttore
        public Gps(Context c){
                myContext=c;
                locationManager=(LocationManager)c.getSystemService(Context.LOCATION_SERVICE);
                getLocation();
        }
        public Location getLocation(){
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
                //locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
                if(locationManager!=null){
                        posizione=locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        if(posizione!=null){
                                latitudine=posizione.getLatitude();
                                longitudine=posizione.getLongitude();
                        }
                }
                return posizione;
        }
        //metodi get
        public double latitudine(){
                if(posizione!=null){
                        latitudine=posizione.getLatitude();
                }
                return latitudine;
        }
        public double longitudine(){
                if (posizione!=null){
                        longitudine=posizione.getLongitude();
                }
                return longitudine;
        }
        //una volta trovata la posizione stoppa il gps per risparmiare batteria
        public void stopGps(){
                if(locationManager!=null){
                        locationManager.removeUpdates(Gps.this);
                }
        }
        @Override
        public void onLocationChanged(Location location) {
                // TODO Auto-generated method stub
               
        }
        @Override
        public void onProviderDisabled(String provider) {
                // TODO Auto-generated method stub
               
        }
        @Override
        public void onProviderEnabled(String provider) {
                // TODO Auto-generated method stub
               
        }
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
                // TODO Auto-generated method stub
               
        }

}

EDIT: mi sono dimenticato nell'execute() del task di mettere l'argomento e cioè s ma mettendolo comunque non funziona rimane sempre attivo il progressbar
« Ultima modifica: 19 Novembre 2013, 18:15:06 CET da tafazzi87 »

iClaude

  • Visitatore
Re:asynctask per posizione gps
« Risposta #1 il: 20 Novembre 2013, 20:38:48 CET »
0
Ma è corretto indicare un parametro void per il metodo onPostExecute, quando nella dichiarazione della classe avevi specificato LatLng?

Offline tafazzi87

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Google nexus 7 - acer E330
  • Sistema operativo:
    Ubuntu 12.04 - Mac OS X 10.6.8
Re:asynctask per posizione gps
« Risposta #2 il: 21 Novembre 2013, 11:06:03 CET »
0
si scusa ho cambiato in LatLng adesso ma adesso va direttamente al onPostExecute, però accende il gps quindi passa al doInBackground solo per un attimo...il problema secondo me dovrebbe essere che fino a che adesso.latitude!=0 dovrebbe continuare a fare il doInBackground ma se metto un if o un while crasha subito...
e poi non capisco, il parametro di onPostExecute quale deve essere? a parte che deve essere un LatLng...
« Ultima modifica: 21 Novembre 2013, 11:09:28 CET da tafazzi87 »

iClaude

  • Visitatore
Re:asynctask per posizione gps
« Risposta #3 il: 21 Novembre 2013, 12:02:17 CET »
0
Premettendo che potevi gestire il tutto senza bisogno di usare un AsyncTask, ma semplicemente usando i listener di LocationManager, il tuo metodo getLocation a me pare che ritorni subito, restituendo l'ultima posizione nota.
Non c'è alcuna ricerca della posizione corrente.