Android находит местоположение GPS один раз, показывает диалоговое окно загрузки

Если у вас есть этот скрипт в голове, вы можете захотеть переместить его после всего тела. Не работает:

<head>
<script src="doDOM.js"></script>
</head>

Работает:

<body>
<h1>HI!</h1>
<script src="doDOM.js"></script>
</body>
26
задан Daniel Bowden 7 September 2011 в 15:03
поделиться

2 ответа

Используйте AsyncTask и используйте как network_provider, так и gps_provider , что означает два слушателя. GPS требует больше времени, чтобы исправить это, может быть, иногда и минуты, и работает только на открытом воздухе, в то время как сеть довольно быстро определяет местоположение.

Вот хороший пример кода: Какой самый простой и надежный способ узнать текущее местоположение пользователя на Android?

Для AsyncTask см. http://developer.android.com/ reference / android / os / AsyncTask.html

Здесь также есть много примеров кода для этого SO, например здесь: Android Показывать диалоговое окно, пока поток не будет завершен, а затем продолжить программу

РЕДАКТИРОВАТЬ: концепция кода:

добавить переменную класса

boolean hasLocation = false;

вызвать в onCreate (не в AsyncTask):

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

затем в locationListener.onLocationChanged изменить значение, как только местоположение будет найдено:

boolean hasLocation = false;

AsyncTask: оставьте как есть, но не звоните

LocationHelper location = new LocationHelper();
location.getLocation(params[0], locationResult);

туда, вместо этого звоните

Long t = Calendar.getInstance().getTimeInMillies(); 
while (!hasLocation && Calendar.getInstance().getTimeInMillies()-t<30000)) {
    Thread.Sleep(1000); 
};    

, вероятно, с задержкой между ними будет достаточно.

16
ответ дан 28 November 2019 в 07:53
поделиться

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

Если кто-то столкнется с этим и предложит гораздо лучший, более чистый результат, чтобы просто получить координаты текущего местоположения пользователя только один раз, то перестаньте смотреть, что было бы очень полезно !!

private LocationControl locationControlTask;
private boolean hasLocation = false;
LocationHelper locHelper;

Из onCreate () я вызываю

locHelper = new LocationHelper();
locHelper.getLocation(context, locationResult);
locationControlTask = new LocationControl();
locationControlTask.execute(this);

У меня есть личный класс LocationControl

private class LocationControl extends AsyncTask<Context, Void, Void>
    {
        private final ProgressDialog dialog = new ProgressDialog(activityname.this);

        protected void onPreExecute()
        {
            this.dialog.setMessage("Searching");
            this.dialog.show();
        }

        protected Void doInBackground(Context... params)
        {
            //Wait 10 seconds to see if we can get a location from either network or GPS, otherwise stop
            Long t = Calendar.getInstance().getTimeInMillis();
            while (!hasLocation && Calendar.getInstance().getTimeInMillis() - t < 15000) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            };
            return null;
        }

        protected void onPostExecute(final Void unused)
        {
            if(this.dialog.isShowing())
            {
                this.dialog.dismiss();
            }

            if (currentLocation != null)
            {
                useLocation();
            }
            else
            {
                //Couldn't find location, do something like show an alert dialog
            }
        }
    }

Затем locationResult ..

public LocationResult locationResult = new LocationResult()
    {
        @Override
        public void gotLocation(final Location location)
        {
            currentLocation = new Location(location);
            hasLocation = true;
        }
    };

Также, чтобы не вырывать волосы, как я делал целую вечность, не забывайте останавливать задачу locationcontrol, если кто-то рано покидает активность, а также останавливать обновления местоположения, чтобы остановить запуск GPS, когда пользователь уходит. В onStop () сделайте что-то вроде этого:

locHelper.stopLocationUpdates();
locationControlTask.cancel(true);

Кроме того, stopLocationUpdates в классе Location Helper делает следующее:

public void stopLocationUpdates()
{
locationManager.removeUpdates(locationListenerGps);
locationManager.removeUpdates(locationListenerNetwork);
}

Удачи с этим, мне это нужно ...

12
ответ дан Daniel Bowden 28 November 2019 в 07:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: