Хобрук: Ваш путь к мастерству в программировании

Кнопка «Стоп» не останавливает мою службу определения местоположения

Я пытаюсь написать службу, которая работает с интервалом. И каждый раз, когда он запускается, он должен получать текущее местоположение мобильного телефона. И, насколько мне кажется, мой интервал работает правильно. Но как только я нажимаю кнопку «Пуск», я больше не могу использовать кнопку «Стоп», чтобы остановить его. Я уже пробовал использовать Thread, но он просто продолжает выдавать мне ошибки. Я также пробовал это с циклом while, но почему-то мое приложение просто падает. Во всяком случае, это мой код прямо сейчас:

public class Location extends Service {

LocationManager locMan;
LocationListener myLocListener;
int intervalTime = 1000 * 30;
int minTime = 0;
float minDistance = 0;

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void onCreate() {
    // TODO Auto-generated method stub
    final Handler handler = new Handler();
    final Runnable runnable = new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub

            locMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

            //check if GPS is on
            if (!locMan.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                Toast.makeText(
                        getApplicationContext(),
                        "Failed to start Location service! Please turn you GPS on!",
                        Toast.LENGTH_LONG).show();
                stopSelf();
            } else if (locMan.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                Toast.makeText(getApplicationContext(),
                        "Service Started",
                        Toast.LENGTH_SHORT).show();
                getLocation();
            }
        }

        private void getLocation() {
            // TODO Auto-generated method stub
            try {

                locMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

                //while GPS remains on, run this script.
                while (locMan.isProviderEnabled(LocationManager.GPS_PROVIDER)) {

                    myLocListener = new LocationListener() {

                        @Override
                        public void onStatusChanged(String provider,
                                int status, Bundle extras) {
                            // TODO Auto-generated method stub

                        }

                        @Override
                        public void onProviderEnabled(String provider) {
                            // TODO Auto-generated method stub

                        }

                        @Override
                        public void onProviderDisabled(String provider) {
                            // TODO Auto-generated method stub

                        }

                        @Override
                        public void onLocationChanged(
                                android.location.Location location) {
                            // TODO Auto-generated method stub
                            String loc = "Latitude is: "
                                    + location.getLatitude()
                                    + "Longitude is: "
                                    + location.getLongitude();

                            Toast.makeText(getApplicationContext(),
                                    loc,
                                    Toast.LENGTH_SHORT).show();
                        }
                    };

                    // Specify criteria for a gps provider and get the provider
                    Criteria criteria = new Criteria();
                    criteria.setPowerRequirement(Criteria.POWER_LOW);
                    criteria.setAccuracy(Criteria.ACCURACY_FINE);
                    criteria.setAltitudeRequired(false);
                    criteria.setBearingRequired(false);
                    criteria.setCostAllowed(true);
                    criteria.setSpeedRequired(false);

                    String BestProvider = locMan.getBestProvider(criteria,
                            false);

                    locMan.requestLocationUpdates(BestProvider,
                            minTime,
                            minDistance,
                            myLocListener);

                    Toast.makeText(getApplicationContext(),
                            "Location Retrieved",
                            Toast.LENGTH_SHORT).show();

                    handler.postDelayed(this, intervalTime);
                }
                stopSelf();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };
    handler.postDelayed(runnable, intervalTime);
}

@Override
public void onDestroy() {
    // TODO Auto-generated method stub
    if (myLocListener != null) {
        locMan.removeUpdates(myLocListener);
    }

    Toast.makeText(getApplicationContext(),
            "Service stopped",
            Toast.LENGTH_LONG).show();
    super.onDestroy();
}

}


Ответы:


1

вы используете getLocation() в Runnable, я думаю, вам нужен один новый обработчик в вашем запускаемом объекте, а в onDestroy отправьте сообщение этому обработчику, чтобы остановить прослушивание местоположения.

В вашем runnable внутри HandleMessage вы можете перестать прослушивать местоположение.

Как насчет использования библиотеки cwac-locpoll? Она точно соответствует вашим требованиям. .

04.04.2013
  • Нет, даже тогда он замерзнет. И отвечает только на кнопку домой. 08.04.2013

  • 2

    Почему бы не позволить службе просто работать и указать LocationManager уведомлять вас только в intervalTimes. Другими словами, удалите stopSelf() и установите minTime на 1000 * 30.

    08.04.2013
  • Потому что должна быть возможность остановить службу в любое время. Без необходимости ждать местоположения, когда он работает. 08.04.2013
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..