2013-07-23 4 views
0

Что мне нужно сделать, чтобы мой локатор-локатор мог запустить его onLocationChanged?Android onLocationChanged не называется

Я новичок в этом материале (java and android). Вот что я делаю. Я обрабатываю запрос для местоположения, вызывая context.startService (serviceIntent); Внутри службы намерения У меня есть вложенный класс, который будет действовать как LocationListener в стороне метода onHandleIntent. Я запускаю поток, который запрашивает обновления местоположения. . Я поддерживаю ссылку на объект LocationListener и протектор в методе OnHandleIntent.

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

Проблема заключается в том, что метод onLocationChanged никогда не вызывается. Объект LocationListener по-прежнему действует до конца метода onHandleIntent. Я могу даже позвонить напрямую и получить отладочное сообщение, которое я ожидаю. Я уверен, что DDMS меняет местоположение, поскольку я распечатал его в различных журналах отладки, и я вижу, как это меняется.

Вот код:

package com.example.locationrequestreceiver; 

import android.app.IntentService; 
import android.content.Context; 
import android.content.Intent; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.os.Looper; 
import android.util.Log; 

public class LocationRequestService extends IntentService { 


    private LocationManager locationManager; 

    public class UpdateHandler implements Runnable, LocationListener { 

     @Override 
     public void onLocationChanged(Location arg0) { 
      Log.d("myStuff", "inside location changed"); 
     } 

     @Override 
     public void onProviderEnabled(String provider) {} 
     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) {} 
     @Override 
     public void onProviderDisabled(String provider) {} 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      Looper.prepare(); 
      Log.d("myStuff", "inside thread"); 
      locationManager.requestLocationUpdates("gps", 0, 0, this); 
      Log.d("myStuff", "run ending"); 
      Looper.loop() // <--- this was the fix 
     } 

    } 

    public LocationRequestService() { 
     super("LocationRequrestService"); 
     Log.d("myStuff", "inside the service"); 
    } 

    @Override 
    protected void onHandleIntent(Intent arg0) { 
     locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     UpdateHandler update_handler = new UpdateHandler(); 
     Thread update_handler_thread = new Thread(update_handler); 
     Log.d("myStuff", "starting thread"); 
     update_handler_thread.start(); 

     for (int count = 0; count < 20; count++) { 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException ex) { 
       Thread.currentThread().interrupt(); 
      } 
     } 
     Location location = locationManager.getLastKnownLocation("gps"); 
     update_handler.onLocationChanged(location); 
    } 




} 

ответ

0

Вызывающий поток должен иметь Looper. Вы можете использовать HandlerThread вместо Thread.

+0

Можете ли вы немного рассказать о том, как это сделать здесь. Я прочитал документ и несколько вещей в HandlerThread, но неясно, как его использовать здесь. – nPn

+0

BTW ... это дало мне подсказку, чтобы вызвать метод Looper.loop() в моем методе run thread, но я хотел бы попытаться заставить HandlerThread работать – nPn

+0

Простым решением было бы просто запустить LocationListener на главном Пользовательский интерфейс. Обновления местоположения по сути являются асинхронными, поэтому они не будут блокировать ваш поток пользовательского интерфейса. Есть ли причина, почему это должно выполняться в отдельном потоке? – ashwin153

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