2012-12-04 14 views
7

Ho un'app che ottiene una correzione della posizione. L'app deve essere distribuita ai telefoni da Gingerbread up. Una volta che l'app ottiene una posizione, viene visualizzato un messaggio di brindisi per l'utente. Il problema è quando l'utente passa alla prossima attività, il messaggio di toast appare forse altre dieci volte.android locationManager continua a chiamare onLocationChanged dopo removeUpdates

Penso di aver implementato il ciclo di vita in modo corretto ad esempio

1) ottenere un manager in posizione onCreate() 2) creare e passare una posizione ascoltatore al gestore in onResume() 3) rimuovere gli aggiornamenti in onStop()

ho capito che posso aggirare questo problema in Android> 4.x chiamando

mlocManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, mlocListener, null); 

ma devo accogliere Gingerbread quindi chiamare una singola richiesta non è in api 2.3.x. Funziona bene su Android 4, ma su Gingerbread il metodo onLocationChanged continua ad eseguirne altre 10 volte.

Come posso forzare l'esecuzione del metodo onLocationChanged una sola volta sul pan di zenzero?

grazie.

[modifica] Ho notato che quando mi muovo per la prossima attività del metodo onlocationchanged mantiene l'esecuzione, ma se mi trasferisco in un ulteriore attività allora le richieste di posizione vengono rimossi con successo

@Override 
protected void onStop() { 
    mlocManager.removeUpdates(mlocListener); 
    mlocListener = null; 
    super.onStop(); 
} 

@Override 
protected void onResume() { 
    mlocListener = new MyLocationListener(); 
    if(isCompOptionsReceived == true){ 
     if (Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD_MR1) { 
      mlocManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, mlocListener, null); 
     }else{ 
      mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener); 
     } 
    }   
    super.onResume(); 
} 

private class MyLocationListener implements LocationListener { 

    @Override 
    public void onLocationChanged(Location loc) { 
     //toast message 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
    } 

    @Override 
    public void onStatusChanged(String provider, int status,      Bundle extras) { 
    } 

}//end of MyLocationListener 

@Override 
protected void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    nfcscannerapplication = (NfcScannerApplication) getApplication(); 
    sIs = savedInstanceState; 
    setContentView(R.layout.entryscreen); 
    mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
+0

questo collegamento potrebbe aiutare. controlla la prima risposta. http://stackoverflow.com/questions/3449676/locationmanager-calling-onlocationchanged-too-often –

risposta

3

Il seguente codice deve essere eseguito sul metodo onPause, non su onStop

mlocManager.removeUpdates(mlocListener); 
mlocListener = null; 

Che lo risolverà per tutte le versioni di Android.

+0

Ciao, ho modificato il codice per l'esecuzione nel metodo onPause() ma una volta che è stato acquisito un blocco di posizione, continua a ottenere circa 5 blocchi in più prima che l'ascoltatore venga rimosso. Questo ha un effetto sulla mia app, perché in onLocationchanged ho presentato all'utente una finestra di avviso. In questo modo è possibile vedere una nuova finestra di dialogo mentre il listener di posizione riceve i nuovi blocchi prima che venga definitivamente annullato. C'è un modo per annullare la registrazione dell'ascoltatore subito dopo aver trovato una serratura? Grazie – turtleboy

+0

Ovviamente, puoi sempre annullare la registrazione del listener la prima volta che onLocationChanged viene chiamato (e ignora ulteriori chiamate), ma non ha molto senso per me, specialmente perché la prima posizione non è solitamente la migliore in termini di accuratezza e precisione –

+0

Ciao, ho annullato gli aggiornamenti rimossi all'interno del metodo onLocationChanged e funziona perfettamente. Capisco cosa stai dicendo riguardo al fatto di non ottenere una correzione precisa e normalmente non lo farei per le posizioni, ma ho solo bisogno di un lock per chiamare getTime() sull'oggetto loc. È solo per confrontare il tempo esterno con il tempo di sistema. Grazie – turtleboy

Problemi correlati