2010-12-28 3 views
2

Привет,Android: Таймер в фоновом режиме

Я пытаюсь реализовать таймер, который отправляет GPS-координаты на мой сервер каждые 10 секунд.

Вот фрагмент кода из службы я реализующей:

@Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Timer timer=new Timer(); 
     TimerTask tt=new TimerTask(){ 
      @Override 
      public void run() { 
       Location loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
       sendCoords(String.valueOf(loc.getLatitude()), String.valueOf(loc.getLongitude())); 
       Toast.LENGTH_SHORT).show(); 
       Log.i("EOH",String.valueOf(loc.getLatitude())); 
      } 
     }; 
     timer.schedule(tt,0,10000); 

     return START_STICKY; 
    } 

Теперь проблема заключается в том, что что-то внутри бега() вызывает мое приложение, чтобы заставить закрытым.

Здесь LogCat свалка:

12-28 18: 44: 18,284: ОШИБКА/AndroidRuntime (6537): ФАТАЛЬНАЯ ИСКЛЮЧЕНИЕ: Таймер-0 12-28 18: 44: 18,284: ERROR/AndroidRuntime (6537): java.lang.RuntimeException: не Можно создать обработчик внутри потока, который имеет не называется Looper.prepare() 12-28 18: 44: 18,284: ERROR/AndroidRuntime (6537): на android.os.Handler. (Handler.java:121) 12-28 18: 44: 18.284: ОШИБКА/AndroidRuntime (6537): в prestocab.driver.Background $ 2 (Background.java:83) 12-28. 18: 44: 18,284: ОШИБКА/AndroidRuntime (6537): в prestocab.driver.Background. sendCoords (Background.java:83) 12-28 18: 44: 18.284: ОШИБКА/AndroidRuntime (6537): at prestocab.driver.Background $ 3.run (Background.java:114) 12-28 18:44 : 18,284: ОШИБКА/AndroidRuntime (6537): в java.util.Timer $ TimerImpl.run (Timer.java:289) 12-28 18: 44: 18,554: ERROR/WindowManager (1310): возвращение в removeWindowLocked

Может ли кто-нибудь предложить исправить это?

Я попытался использовать функцию locationManager onLocationChanged(), но не могу установить интервал до 10 секунд. По-видимому, указанное время является лишь руководством, и ОС определяет, что лучше. Даже когда я устанавливаю интервал до 100 секунд, он дает мне место каждую секунду или около того. Отсюда и причина для использования таймера.

Я надеюсь, что кто-то может что-то предложить.

Спасибо заранее,

+0

Вы уверены, что "lm.requestLocationUpdates (LocationManager.GPS_PROVIDER, 5000, 1, lr);" не помогает ? третий параметр - это минимальное расстояние для запуска другого обновления местоположения, тогда как второй параметр - тот, который вы после - минимальное время между обновлениями местоположения. В зависимости от того, какое условие выполняется в первую очередь, вы получаете обновление местоположения. – kellogs

+0

@kellogs По-видимому, из этого сообщения http://stackoverflow.com/questions/4418018/android-locationmanager-requestlocationupdates-doesnt-respect-params параметры являются только индикаторами, и каждое отдельное устройство решает, что лучше ... – Eamorr

ответ

7

Я пытаюсь реализовать таймер, который отправляет GPS координаты на мой сервер каждые 10 секунд.

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

Вот фрагмент кода из службы я реализующей:

То есть недостатки.getLastKnownLocation(), как правило, возвращают null, для начала, за пределами вашего Timer/TimerTask вопрос.

Я надеюсь, что кто-то может что-то предложить.

Я бы начал с перепроектирования вашего приложения, чтобы избавиться от 10-секундной концепции в качестве жесткого требования.

Тогда, используйте requestLocationUpdates(). Если вы получаете слишком много чтений, игнорируйте те, которые вы не хотите, и не отправляете их на сервер. И, конечно же, пожалуйста, используйте это только в течение короткого периода времени и только на основе положительного пользовательского запроса (например, при выполнении вашего приложения), учитывая потребление батареи, связанную с включением GPS-радио.

Документация для requestLocationUpdates() определенно запутанна в отношении временного фронта - я только недавно понял, что минимальное время не обязательно соблюдается.

+0

Эй, извините за запоздалый ответ. Я принял ваш совет и просто проигнорировал показания, которые приходили слишком часто. Гораздо проще, чем этот тайный малярий! – Eamorr

+1

@CommonsWare вежливо не согласен. хотя первоначальный пользователь решил, что ему не нужно время, связанное с событием, приложение, о котором идет речь, само по себе не является бесполезным. скажем, что вам нужно знать, где пользователь каждые 20 секунд (я согласен, что 10 может быть преувеличено). у вас может не быть исправления местоположения, если вам нужно загружать запрос местоположения каждые 10 секунд, но вы должны иметь место кэширования, прежде чем вы его вызываете. пожалуйста, ознакомьтесь с Deep Dive в Рето Мейер. retoMeier знает свои вещи, он Tech Lead в Google. –

1

Я заметил в стеке трассировку утверждение «Невозможно создать обработчик внутри потока, который не вызвал Looper.prepare() .......», который напоминает мне об ошибке типа поперечной нити или ситуации в результате чего объект еще не завершил настройку своего межфазного состояния.

Я видел видео пару недель назад, когда ведущий делал что-то подобное ... отправка данных из GPS на основе таймера, но я не могу найти его прямо сейчас. Попробуйте сделать поиск по этому вопросу ... это было около часа видео, но стоит того времени.

1

Как вы вызываете элемент Main UI с во внешней резьбой, так что нить MainUI сделает исключение использовать эту функцию при вызове Тост или любой другой компонент пользовательского интерфейса: -

сделать Handler, как это: -

Handler progressHandler = new Handler() { 
    public void handleMessage(Message msg) { 
     // display UI , Update UI 
     /* To do your UI updation here */ 
    } 
}; 

Теперь сделайте ваш поток, как это: -

Thread background = new Thread (new Runnable() { 
    @Override 
    public void run() { 
     // this will be done in the Pipeline Thread 
     /* Do your GPS task here */ 
     // active the update handler 
     progressHandler.sendMessage(progressHandler.obtainMessage()); 
    } 
}); 

// start the background thread 
background.start(); 

Надеется, что это поможет.

Смежные вопросы