Domanda

Sto scrivendo un'applicazione di prova che tiene traccia della posizione degli utenti.L'idea è che posso avviare un servizio che quindi registra per gli aggiornamenti della posizione.Per ora sto usando un intentuservice per quello.

Il codice di servizio (che non funziona ...) è simile a quello:

public class GpsGatheringService extends IntentService {

// vars
private static final String TAG = "GpsGatheringService";
private boolean stopThread;

// constructors
public GpsGatheringService() {
    super("GpsGatheringServiceThread");
    stopThread = false;
}

// methods
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(TAG, "onStartCommand()");
    return super.onStartCommand(intent, flags, startId);
}

@Override
protected void onHandleIntent(Intent arg0) {
    // this is running in a dedicated thread
    Log.d(TAG, "onHandleIntent()");
    LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    LocationListener locationListener = new LocationListener() {

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            Log.d(TAG, "onStatusChanged()");
        }

        @Override
        public void onProviderEnabled(String provider) {
            Log.d(TAG, "onProviderEnabled()");
        }

        @Override
        public void onProviderDisabled(String provider) {
            Log.d(TAG, "onProviderDisabled()");
        }

        @Override
        public void onLocationChanged(Location location) {
            Log.d(TAG, "onLocationChanged()");
        }
    };
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);

    while (!stopThread) {
        try {
            Log.d(TAG, "Going to sleep...");
            Thread.sleep(1500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.d(TAG, "onDestroy()");
    stopThread = true;
}
.

}

Attualmente l'unica cosa che succede è l'uscita di "andare a dormire ...".Ho bisogno di un meccanismo che mantiene vivo il filo (perché altrimenti l'ascoltatore non è più raggiungibile per gli aggiornamenti di stato) e non spreca il tempo della CPU (penso che il looping occupato non sia il modo preferito). Anche se ci sono tonnellate di altri modi come realizzare il comportamento dell'applicazione (registrazione delle coordinate GPS) Sono interessato a una soluzione in questo modo per imparare una tecnica per risolvere i problemi di questa natura!

È stato utile?

Soluzione

.

Come faccio a tenere in vita il filo di un intentuservice?

non lo fai.Non si utilizza IntentService in uno scenario come questo.

.

Ho bisogno di un meccanismo che mantiene vivo il filo (perché altrimenti l'ascoltatore non è più raggiungibile per gli aggiornamenti di stato) e non sprecare il tempo della CPU (penso che il looping occupato non sia il modo preferito)

No, in questo caso un Service va bene, perché controlli quando il servizio sta andando via, si controlla la durata di eventuali thread crei, ecc. IntentService non è adatto per lo scopo previsto, perché controlla quando il servizio sta andando via e IT controlla la durata dei thread.

Altri suggerimenti

Considera l'utilizzo di un Servizio remoto .Ha funzionato per me.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top