2015-07-06 2 views
0

В настоящее время я пытаюсь сделать приложение, которое отслеживает телефон через GPS, используя сервис. чтобы GPS обновил координаты, мне нужно использовать обработчик внутри службы. Сейчас у меня есть проблема: когда я делаю Handler.post, он застревает в цикле, и после этого он полностью игнорирует остальную часть служебного кода.Handler застрял в петле в сервисе Android

Когда я отлаживался, я узнал, что обработчик чередует сообщения между методами, но ничего полезного не вышло из этого, это был просто цикл между одними и теми же методами снова и снова.

Вот мой код Service, который включает в себя обработчик:

public int onStartCommand(Intent intent, int flags, int startId) 
     { 
     ctx = ServicioDeFondo.this; 
     mHandler = new Handler(); 


     reportarGPS = new Thread(new Runnable() { public void run() 
     { 
      try 
      { 
       while(true) 
       { 
        mHandler.post(new Runnable() { 
         @Override 
         public void run() { 
          gps = new GPSTrack(ctx); 
          latitude = String.valueOf(gps.getLatitude()); 
          longitude = String.valueOf(gps.getLongitude()); 
         } 
        }); 

        Thread.sleep(10000); 

        try { 
         new APISendClass().execute(); 
         Thread.sleep(10000); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     catch (Exception e) 
     { 
      //TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     } }); 



     reportarGPS.start(); 

     return START_STICKY; 
    } 

Я "ве застрял здесь целый день, любая помощь будет принята с благодарностью

ответ

0

С вашим кратким описанием проблемы, это трудно чтобы понять, что такое ожидаемое поведение. Вы не объясняете, что делают GPSTrack и APISendClass и какие типы объектов есть. Вы заявляете, что «он застревает в цикле». Неясно, что это за «это». С оператором while (true) , нить будет зависеть до отмены.

Обратите внимание, что методы Service, такие как onStartCommand(), выполняются по основной теме. Это означает, что ваш конструктор Handler() связывает обработчик с основным потоком. Переменные, которые вы отправляете этому обработчику, запускаются в основном потоке. Это то, что вы хотели?

Также обратите внимание, что остановка обслуживания на stopSelf() или Context.stopService() не убивает нить. Вы должны иметь код для отмены потока, когда он больше не нужен. Это часто делается в onDestroy().

Я взял код, который вы отправили, заменил вызовы на неизвестные объекты с помощью операторов журнала и запустил их. Выход логарифма чередуется между «Get lat/long» и «APISendClass()».

Handler mHandler; 
Context ctx; 
Thread reportGPS; 

public int onStartCommand(Intent intent, int flags, int startId){ 
    Log.i("TEST", "onStartCommand()"); 

    ctx = this; 

    // Service methods run on main thread. 

    // Handler constructor with no args associates Handler 
    // with current thread, which here is the main thread. 
    mHandler = new Handler(); 

    reportGPS = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       while (true) { 
        mHandler.post(new Runnable() { 
         @Override 
         public void run() { 
          // This runnable is posted to the main thread. 
          // Is that what you intended? 

          //gps = new GPSTrack(ctx); 
          //latitude = String.valueOf(gps.getLatitude()); 
          //longitude = String.valueOf(gps.getLongitude()); 
          Log.i("TEST", "Get lat/long"); 
         } 
        }); 
        Thread.sleep(2000); 

        try { 
         //new APISendClass().execute(); 
         Log.i("TEST", "APISendClass().execute()"); 
         Thread.sleep(5000); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

    reportGPS.start(); 

    return START_STICKY; 
} 
Смежные вопросы