当从 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();
}
}
}
创建界面如下:
public interface GPSResourceListener {
void onLocationUpdated(Location location);
}
在您的 activity 中实现上述接口并将其实例传递给 GPSResource 构造函数,如下所示:
class YourActivity extends AppCompatActivity implements GPSResourceListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
GPSResource gpsResource = new GPSResource(getApplicationContext(), this);
}
}
在 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);
}
}
我正计划从通用 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();
}
}
}
创建界面如下:
public interface GPSResourceListener { void onLocationUpdated(Location location); }
在您的 activity 中实现上述接口并将其实例传递给 GPSResource 构造函数,如下所示:
class YourActivity extends AppCompatActivity implements GPSResourceListener { @Override protected void onCreate(Bundle savedInstanceState) { GPSResource gpsResource = new GPSResource(getApplicationContext(), this); } }
在 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); } }