Как запросить и удалить обновления locationManager из потока в службу - PullRequest
1 голос
/ 18 августа 2011

У меня есть служба, которая реализует интерфейс LocationListener с помощью методов этого интерфейса.

Когда я запускаю службу, я создаю экземпляр LocationManager.

Затем я запускаю поток, который будет работать без остановки с бесконечным циклом.

Начиная с этой темы, я хотел бы создать locationManager.removeupdates в моем locationManager, созданном в начале службы.

Но есть проблема, по-видимому, мне понадобится лупер, я много чего перепробовал, но не могу его использовать.

По сути, вот мой код, очевидно, я не знаю, как использовать Looper, потому что мой код останавливается после Log.d ("GPS", "GPS Activé");

Меня обыскивали в Looper, но я нашел понятные инструкции на моем языке (я французский) действительно сложно.

Код может показаться странным, потому что, поскольку я много чего удалил ...

public class ServicePrincipal extends Service implements LocationListener {

    boolean localisationOn = false;

    LocationManager locationManager;

    public class MyBinder extends Binder{
        ServicePrincipal getService(){
            return ServicePrincipal.this;
        }
    }

    @Override
    public IBinder onBind(Intent arg0) {
        return new MyBinder();
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onDestroy() {
        locationManager.removeUpdates(this);
        super.onDestroy();
    }

    @Override
    public void onStart(Intent intent, int startId) {

        MyThread mythread = new MyThread();
                    MyThread.start();
        super.onStart(intent, startId);
    }

    public class MyThread extends Thread {

        int nbInfos;
        @Override
        public void run() {

            for (;;) {

                        if (localisationOn)
                        {
                            localisationOn = false;
                            Looper.prepare();
                            stopGPS();
                            Looper.loop();
                        }

                            if (!localisationOn)
                            {
                                Looper.prepare();
                                startGPS();
                                Looper.loop();
                                /* On active le flag de localisation */
                                localisationOn = true;
                            }
                }
                try {
                    Log.d("Boucle for", "~~~~ Fin de boucle ~~~~");
                    this.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public void onLocationChanged(Location location) {
        if ((location != null) && (localisationOn))
        {
            Log.d("Localisation", "Envoi des informations de localisation avec :");
            Log.d("Latitude", String.valueOf(location.getLatitude()));
            Log.d("Longitude", String.valueOf(location.getLongitude()));
        }

    }

    public void onProviderDisabled(String provider) {

    }

    public void onProviderEnabled(String provider) {

    }

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

    }

    public void startGPS()
    {
        /* Intent du service de localisation */
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        /* On active l'actualisation par le GPS et par le réseau téléphonique */
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,1,1,this);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1,1,this);

        Log.d("GPS", "GPS Activé");
    }

    public void stopGPS()
    {

        locationManager.removeUpdates(this);
        Log.d("GPS", "GPS Désactivé");
    }

}

1 Ответ

1 голос
/ 18 августа 2011

Эта проблема возникает, когда из потока вызывается requestLocationUpdates(). Ваша программа будет аварийно завершена. Я решил эту проблему, когда работал. Я изменил ваш код. Надеюсь, теперь ваша проблема с петлителями будет решена. Более того, она устранит вашу проблему с бесконечным циклом. Надеюсь, это поможет.

public class ServicePrincipal extends Service implements LocationListener {

    boolean localisationOn = false;

    LocationManager locationManager;
    private final Handler handler = new Handler();
    public class MyBinder extends Binder{
        ServicePrincipal getService(){
            return ServicePrincipal.this;
        }
    }

    @Override
    public IBinder onBind(Intent arg0) {
        return new MyBinder();
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onDestroy() {
        locationManager.removeUpdates(this);
        super.onDestroy();
    }

    @Override
    public void onStart(Intent intent, int startId) {

        /*MyThread mythread = new MyThread();
                    MyThread.start();*/
    handler.post(getData);
        super.onStart(intent, startId);
    }

    private final Runnable getData = new Runnable() {
        public void run() {
            getDataFrame();      
        }
    };

    private void getDataFrame() {
        if (localisationOn){
                            localisationOn = false;
                            stopGPS();
                }
        if (!localisationOn){
                        startGPS();
                        /* On active le flag de localisation */
                        localisationOn = true;
                }
        handler.postDelayed(getData,10000);

    }
    public void onLocationChanged(Location location) {
        if ((location != null) && (localisationOn))
        {
            Log.d("Localisation", "Envoi des informations de localisation avec :");
            Log.d("Latitude", String.valueOf(location.getLatitude()));
            Log.d("Longitude", String.valueOf(location.getLongitude()));
        }

    }

    public void onProviderDisabled(String provider) {

    }

    public void onProviderEnabled(String provider) {

    }

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

    }

    public void startGPS()
    {
        /* Intent du service de localisation */
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        /* On active l'actualisation par le GPS et par le réseau téléphonique */
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,1,1,this);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1,1,this);

        Log.d("GPS", "GPS Activé");
    }

    public void stopGPS()
    {

        locationManager.removeUpdates(this);
        Log.d("GPS", "GPS Désactivé");
    }

}
...