2014-11-04 2 views
-1

Я новичок в программировании на Android. Поэтому, пожалуйста, простите меня, если это глупый вопрос.Как сделать функцию executino wait in android

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

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

Я использую «getLastKnowLocation()». Код для выборки расположение ниже: -

public String getLocation() 
    { 
     // Get the location manager 
     LocationManager locationManager = (LocationManager)getSystemService(LOCATION_SERVICE); 
    Criteria criteria = new Criteria(); 
    String bestProvider = locationManager.getBestProvider(criteria, false); 
    android.location.Location location = locationManager.getLastKnownLocation(bestProvider); 
    Double lat,lon; 
    DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 
    Date date = new Date(); 
    try { 
     lat = location.getLatitude(); 
     lon = location.getLongitude(); 

    } 
    catch (NullPointerException e){ 

    } 
} 
+0

просто добавьте круг деятельности, указывающий, что местоположение выбрано. (см. http://developer.android.com/design/building-blocks/progress.html) – Aun

+0

были ли вы в состоянии решить вашу проблему или вам нужна дополнительная информация? – DroidDev

ответ

0

Создать логическую переменную locationLoaded. В ваших следующих строк кода:

try { 
    lat = location.getLatitude(); 
    lon = location.getLongitude(); 
    //set the value of variable to true once you get location 
    locationLoaded=true; 
} 
catch (NullPointerException e){ 

} 

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

private void keepCheckingLocation(){ 
    if(locationLoaded){ 
     //location is loaded 
     return; 
    } 
    else{ 
     //location is not loaded yet 
     try { 
      //wait for two seconds 
      Thread.sleep(2000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     //call the method again to check the location 
     keepCheckingLocation(); 
    } 
} 

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

Примечание: Установите locationLoaded=false;, если вам необходимо снова проверить места. Это сделает код более эффективным.

+0

Это хорошая идея. но, к сожалению, это было не очень полезно, так как мое приложение попадает в ловушку после применения этой логики. Я думаю, это может быть потому, что я блокирую поток пользовательского интерфейса, применяя его. Спасибо в любом случае @DroidDev – zstart

+0

@zstart Я использовал этот метод из метода doInBackground для моего класса «AcyncTask». Вы также можете проверить доступность вашей переменной 'locationLoaded'. – DroidDev