Если у вас есть этот скрипт в голове, вы можете захотеть переместить его после всего тела. Не работает:
<head>
<script src="doDOM.js"></script>
</head>
Работает:
<body>
<h1>HI!</h1>
<script src="doDOM.js"></script>
</body>
Используйте 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);
};
, вероятно, с задержкой между ними будет достаточно.
Мне все еще не нравится, как это работает вообще, и кажется, что это намного сложнее, чем должно быть, но пока кто-то не предоставит лучший способ, чтобы я работал сейчас ...
Если кто-то столкнется с этим и предложит гораздо лучший, более чистый результат, чтобы просто получить координаты текущего местоположения пользователя только один раз, то перестаньте смотреть, что было бы очень полезно !!
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);
}
Удачи с этим, мне это нужно ...