-1

Я использую GoogleApiClient для определения местоположения пользователя. Я создал одноэлементный класс, чтобы получить местоположение пользователя. Вот что класс:Как вернуть значение в GoogleApiClient onConnected()?

public class LocationUtils { 

    private static LocationUtils locationUtils; 
    private GoogleApiClient googleApiClient; 

    public static LocationUtils getInstance() { 

     if(locationUtils == null) 
      locationUtils = new LocationUtils(); 
     return locationUtils; 
    } 

    private LocationUtils() {} 

    public Location getLocation(Context context){ 

     final Location[] location = {null}; 

     googleApiClient = new GoogleApiClient.Builder(App.getContext()) 
       .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { 
        @Override 
        public void onConnected(Bundle bundle) { 
         if(ContextCompat.checkSelfPermission(App.getContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) 
          location[0] = LocationServices.FusedLocationApi.getLastLocation(googleApiClient); 

         googleApiClient.disconnect(); 
        } 

        @Override 
        public void onConnectionSuspended(int i) { 

        } 
       }) 
       .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() { 
        @Override 
        public void onConnectionFailed(ConnectionResult connectionResult) { 

        } 
       }) 
       .addApi(LocationServices.API) 
       .build(); 

     googleApiClient.connect(); 

     return location[0]; 

    } 



} 

Я хочу, чтобы получить местоположение пользователя с LocationUtils.getInstance() getLocation (контекст).. Когда я вызываю метод getLocation(), он должен подключиться к GoogleApiClient, вернуть местоположение пользователя и отключиться от GoogleApiClient для каждого вызова. Но когда я вызываю этот метод, он возвращает null. Основной поток не ждет метода onConnected() и возвращает объект location как null. Как он может ожидать метод onConnect()? ИЛИ как я могу вернуть объект Location в onConnected()?

решаемые согласно ответу Тима Castelijns в

Сначала я создал интерфейс:

public interface LocationCallbackInterface { 
    void onComplete(Location location); 
} 

затем использовали его в getLocationMethod():

общественная пустота getLocation (контекст Контекст, конечный LocationCallbackInterface обратный вызов) {

final Location[] location = {null}; 

googleApiClient = new GoogleApiClient.Builder(App.getContext()) 
     .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { 
      @Override 
      public void onConnected(Bundle bundle) { 
       if(ContextCompat.checkSelfPermission(App.getContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
        location[0] = LocationServices.FusedLocationApi.getLastLocation(googleApiClient); 
        //Toast.makeText(App.getContext(), "location came :" + location[0].toString(), Toast.LENGTH_LONG).show(); 
        callback.onComplete(location[0]); 
       } 

       googleApiClient.disconnect(); 
      } 

      @Override 
      public void onConnectionSuspended(int i) { 

      } 
     }) 
     .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() { 
      @Override 
      public void onConnectionFailed(ConnectionResult connectionResult) { 

      } 
     }) 
     .addApi(LocationServices.API) 
     .build(); 

googleApiClient.connect(); 

}

тогда называли этот метод в деятельности:

LocationUtils.getInstance().getLocation(getActivity(), new LocationCallbackInterface() { 

      @Override 
      public void onComplete(Location location) { 
       if (location != null) { 
        Toast.makeText(getActivity(), "location :" + location.toString(), Toast.LENGTH_SHORT).show(); 
        initCamera(location); 
       } else 
        Toast.makeText(getActivity(), "location is null", Toast.LENGTH_SHORT).show(); 
      } 
     }); 

ответ

2

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

Определить интерфейс, как этот

public interface LocationCallback { 
    void onComplete(Location location); 
} 

Изменение

public Location getLocation(Context context) 

к

public Location getLocation(Context context, LocationCallback callback) 

и назвать его, как это

LocationUtils.getLocation(context, new LocationCallback() { 
    @Override 
    onComplete(Location location) { 
     // when this is called, you will have a location. 
    } 
}); 
Смежные вопросы