Android GPS определяет путь Федора - «Только исходный поток, создавший иерархию представлений, может касаться его представлений» - PullRequest
1 голос
/ 20 февраля 2012

Я следую за этим постом Какой самый простой и надежный способ узнать текущее местоположение пользователя на Android?

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

Скопируйте и вставьте код в мое приложение, и оно работает на моем Samsung S2, но не работает в эмуляторе (2.3).

Мои вопросы:

  1. При запуске в эмуляторе код никогда не достигает методов onLocationChanged (), вместо этого он будет ждать 20 секунд (тайм-аут, установленный timer1), чтобы запустить run () функции GetLastLocation.Почему?

  2. Теперь метод run () класса GetLastLocation всегда вызывается, и я получил исключение выше.

    (E / AndroidRuntime (436)): android.view.ViewRoot $ CalledFromWrongThreadException: только исходный поток, создавший иерархию представлений, может касаться его представлений.).

Я предполагаю, что ошибка возникает в моем коде:

    public LocationResult locationResult = new LocationResult()
    {
        @Override
        public void gotLocation(final Location location)
        {
            Log.i(LOG_TAG, "gotLocation");
            if (location == null)
            {
                Log.i(LOG_TAG, "Cannot get location");
            }
            else
            {
                Log.i(LOG_TAG, "Lat: " + location.getLatitude() + " Long:" + location.getLongitude());
                tv = (TextView) findViewById(R.id.my_text); // <<< error here!!!
                            tv.setText(lat + "," + lon);
            }
        }
    };

TextView TV инициализируется в моей основной деятельности, которая вызывает MyLocation myLocation = new MyLocation(); и myLocation.getLocation(this, locationResult);.Дизайн такой же, как и у поста.Интересно, вызывается ли run () GetLastLocation в другом потоке?Почему это?У кого-нибудь возникла такая же проблема?

Большое спасибо!

1 Ответ

1 голос
/ 21 февраля 2012

При использовании эмулятора вам необходимо указать текущее местоположение. Это можно сделать несколькими разными способами. Se их здесь . Я думаю, что самый простой способ начать тестирование - это использовать команды telnet и geo.

Как вы можете использовать findViewById Я полагаю, вы находитесь во внутреннем классе какого-то Activity. Итак, используйте метод runOnUiThread , чтобы обновить ваши представления

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        tv = (TextView) findViewById(R.id.my_text); 
        tv.setText(lat + "," + lon);
    }
});

В примере кода обновления местоположения принимаются через задачу таймера, поэтому она выполняется в отдельном потоке.

...