2010-07-06 4 views
2

У меня возникли проблемы с подключением GPS onLocationChanged для работы в другом потоке. Я понимаю, как управлять потоком пользовательского интерфейса при вызове функции, но с помощью GPS, я не активно вызываю функцию.Android Callback от UI Thread

Мое намерение - иметь световую вспышку каждый раз, когда GPS получает чтение. Я включил эту функцию в Runnable. Я передал эту функцию классу, который реализует LocationListener. Затем в основном классе я начал новый поток, который вызывает requestLocationUpdates. Я надеялся, что onLocationChanged из LocationListener будет работать в другом потоке, отправить в обратный вызов и сделать необходимые эффекты пользовательского интерфейса в потоке пользовательского интерфейса. К сожалению, программа вылетает каждый раз при попытке вызвать requestLocationUpdates. Каков правильный способ сделать это?

Прямо сейчас это выглядит примерно так

Главный класс:

final Runnable changeLight = new Runnable(){ 
     public void run(){ 
      // do stuff 
     } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.capture); 

     status = (ImageView) findViewById(R.id.status); 
     database = new DatabaseManager(this); 

     new Thread(){ 
      public void run(){ 
       location = (LocationManager) getSystemService(LOCATION_SERVICE); 
       listener = new GPSManager(database, changeLight, light, status); 
       location.requestLocationUpdates("gps", 10000L, 0, listener); 
      } 
     }.start(); 
    } 

LocationListener класса:

public void onLocationChanged(Location location) { 
     if (location.getAccuracy() <= 32.0){ 
      light = lightColors.Green; 
      status.post(callback); 
      database.insertData(location); 
     } 
     else{ 
      light = lightColors.Yellow; 
      status.post(callback); 
     } 
    } 

Исключение говорит, что не удается создать обработчик внутри потока, который не называется Looper .prepare()

ответ

2

нити, где вы звоните location.requestLocationUpdates должно Looper (см here). Вы можете использовать HandlerThread вместо Thread.

0

Не могли бы вы возникнуть проблемы неправильная синхронизация основного потока? Получаете ли вы какие-либо исключения до сбоя приложения? Можете ли вы разместить пример, совместимый с sscce.org?

В общем, когда вы обрабатываете асинхронные события на GUI вы должны иметь правильную синхронизацию: http://developer.android.com/resources/articles/painless-threading.html

+0

Я добавил код и исключение – xster

1

Я столкнулся с той же проблемой. Решение оказалось, что новый поток, в котором вы хотите получать обновления местоположения из диспетчера местоположений, должен быть потоком Looper. Для этого вам нужно добавить следующие строки в функции run() вашего потока.

Looper.prepare();

Looper.loop();