1

Мне нужно получить текущее местоположение, а после этого - сделать следующий код. Как я могу ждать, пока этот метод закончен? onLocationChanged вызывается автоматически, поэтому у меня проблема. Есть ли у кого-нибудь идеи, как это сделать? Я делаю это очень глупо, в OnLocationChanged() я звоню onResume(), но это плохая идея.Ждать onLocationChanged (Location location)

@Override 
public void onLocationChanged(Location location) { 

    final Location loc = location; 

    Log.d("myLogs", "OnChange2"); 
    Log.d("myLogs", "2" + loc.getLatitude() + "," + loc.getLongitude()); 
    myLat = loc.getLatitude(); 
    myLong = location.getLongitude(); 
    onResume(); 

} 
+1

Вы не должны звонить по телефону. Что вы хотите, чтобы произойти с изменением местоположения? – ditkin

+0

Я должен получить координаты оттуда и работать с ним в onResume() –

ответ

2

Возможно, вы захотите использовать AsyncTask. См. Android find GPS location once, show loading dialog ответы. В основном в onPreExecute вы можете начать диалог (он начинается до того, как вызывается doInBackground). Это означает, что вы ожидаете времени, когда сможете найти место и показать диалог. Затем в doInBackground вы можете найти место. После этого заканчивается onPostExecute. Вы можете остановиться изнутри onPostExecute. Вы можете проверить, не является ли местоположение нулевым, а затем вызвать другую функцию изнутри onPostExecute, также если вы хотите.

Это может быть один из способов. Вы можете изучить базовый пример от AsyncTask Android example. Вы также можете начать с чтения документации here и прочитать How to Get GPS Location Using AsyncTask?.

Некоторых другие подобных полезным вопросы:

Wait for current location - GPS - Android Dev

getting location instantly in android

Надеется, что это помогает.

+0

Я думаю, что я должен изучить AsyncTask, но теперь, что более простое решение? –

+0

Я думаю, что когда-нибудь или в другом случае, если бы вы были полезны для вас. Это прямолинейно. Вы можете попробовать начать с 3 основных функций doInBackground, onPreExecute и onPostExecute. onPreExecute вызывается непосредственно перед запуском фонового процесса. Вещи внутри doInBackground выполняются в фоновом потоке. onPostExecute запускается после фонового процесса. –

+0

Хорошо, но 1. В каком потоке onLocationChange() запущен и где он запущен. 2 Как я могу сделать onLocationChange() в фоновом режиме, если этот метод вызывает систему? –

0

Я понимаю, что OP принял вышеупомянутый ответ, но у меня есть чувство, что OP хочет получить более простой ответ.

Я предполагаю, что у OP есть приложение Android с активностью. Я объявил мину так:

public class HelloAndroidActivity extends Activity implements LocationListener { 

ОП был смущен относительно того, как методы жизненного цикла работали и когда работа должна быть выполнена. Мое резюме и Pause методы будут выглядеть следующим образом:

@Override 
protected void onPause() { 
    ((LocationManager)getSystemService(Context.LOCATION_SERVICE)).removeUpdates(this); 
    super.onPause(); 
} 

@Override 
protected void onResume() { 
    ((LocationManager)getSystemService(Context.LOCATION_SERVICE)).requestLocationUpdates(LocationManager.GPS_PROVIDER, 5 * 1000, 1, this); 
    super.onResume(); 
} 

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

Поскольку деятельность реализует LocationListener моего onLocationChanged метод выглядит следующим образом:

@Override 
public void onLocationChanged(Location location) { 
    // Update the location fields 
    ((EditText)findViewById(R.id.latField)).setText(Double.toString(location.getLatitude())); 
    ((EditText)findViewById(R.id.longField)).setText(Double.toString(location.getLongitude())); 
} 

Это просто занимает новое место и обновляет некоторые EditText поля текста, что я имею в моей деятельности. Единственное, что мне нужно сделать, чтобы добавить разрешение GPS на мой манифест:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

Так что, если бы я с вопросом, как начать использовать менеджер местоположения и услуги определения местоположения это было бы, как я бы начал. Я не пытаюсь отнять что-либо от принятого ответа, я просто думаю, что было фундаментальное непонимание того, что делать в onResume и методах onLocationMethodChanged.