Android GPS обратный вызов отключен - PullRequest
2 голосов
/ 06 июля 2010

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

Мое намерение состоит в том, чтобы иметь вспышку света каждый раз, когда 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 ()

Ответы [ 3 ]

3 голосов
/ 15 июля 2010

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

1 голос
/ 07 апреля 2011

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

Looper.prepare ();

Looper.loop ();

0 голосов
/ 06 июля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...