当从 Android 中的 Activity 引用时,如何等待调用 onConnected() 方法从通用 Class 获取经纬度?

How do I wait for onConnected() method to be called to get Lat,Long from a Generic Class when referenced from Activity in Android?

我正计划从通用 class 中获取 Activity 中的纬度经度。

    GPSResource gpsResource = new GPSResource(getApplicationContext());
    double lat = gpsResource.getLatitude();

这始终 returns 为空。我应该如何修改代码,以便它等待 onConnected() 被调用,然后 returns 引用的值 activity?

这是我的通用代码 Class:

public class GPSResource implements GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener,LocationSource.OnLocationChangedListener,LocationListener

{
    private Location location; // location
    private double latitude; // latitude
    private double longitude; // longitude
    private GoogleApiClient mGAC;
    private Context mContext;
    public static final String TAG = "GPSresource";
    private LocationRequest mLocationRequest;


public GPSResource(Context c)
    {
        mContext = c;
        try
        {
            buildGoogleApiClient();
        }
        catch(Exception e)
        {
            Log.d(TAG,e.toString());
        }
    }

    protected synchronized void buildGoogleApiClient()
    {
        mGAC = new GoogleApiClient.Builder(mContext)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();

        mLocationRequest = LocationRequest.create()
                .setPriority(LocationRequest.PRIORITY_LOW_POWER)
                .setInterval(10 * 1000)        // 10 seconds, in milliseconds
                .setFastestInterval(1 * 1000); // 1 second, in milliseconds

        mGAC.connect();

    }


    public double getLatitude(){

        return latitude;
    }

    /**
     * Function to get longitude
     * */
    public double getLongitude() {
        if (location != null) {
            longitude = location.getLongitude();
        }

        // return longitude
        return longitude;
    }


    @Override
    public void onConnected(Bundle bundle) {

        Location currentLocation = LocationServices.FusedLocationApi.getLastLocation(mGAC);
        if (currentLocation == null)
        {
            LocationServices.FusedLocationApi.requestLocationUpdates(mGAC, mLocationRequest, this);
        }

        latitude = currentLocation.getLatitude();
        longitude = currentLocation.getLongitude();
    }

    @Override
    public void onConnectionSuspended(int i) {

    }


    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {

    }


private boolean checkLocServices()
{

    LocationManager manager = null;
    boolean isAvailable = false;

    try
    {
        manager = (LocationManager)mContext.getSystemService(mContext.LOCATION_SERVICE);
        if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER)||manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER))
        {
            isAvailable = true;
        }
        else
        {
            isAvailable = false;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return isAvailable;

}


@Override
public void onLocationChanged(Location location) {
    // TODO Auto-generated method stub
    if(location!=null)
    {
        latitude =  location.getLatitude();
        longitude = location.getLongitude();
    }


}

}

  1. 创建界面如下:

    public interface GPSResourceListener {
        void onLocationUpdated(Location location);
    }
    
  2. 在您的 activity 中实现上述接口并将其实例传递给 GPSResource 构造函数,如下所示:

    class YourActivity extends AppCompatActivity implements GPSResourceListener {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            GPSResource gpsResource = new GPSResource(getApplicationContext(), this);
        }
    }
    
  3. 在 GPSResource class 中进行以下更改:

    ...
    public GPSResource(Context c, GPSResourceListener listener) {
        mContext = c;
        mListener = listener
        ...
    }
    ...
    @Override
    public void onConnected(Bundle bundle) {
        ...
        mListener.onLocationUpdated(currentLocation);
    }
    ...
    @Override
    public void onLocationChanged(Location location) {
        if(location!=null) {
            mListener.onLocationUpdated(location);
        }
    }