2016-06-29 1 views
1

Ich plante, Breitengrad Länge in einer Aktivität von einer generischen Klasse zu erhalten.Wie warte ich darauf, dass die onConnected() -Methode aufgerufen wird, um Lat, Long aus einer generischen Klasse zu erhalten, wenn sie von Activity in Android referenziert wird?

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

Dies gibt immer null zurück. Wie sollte ich den Code so ändern, dass er darauf wartet, dass onConnected() aufgerufen wird, und den Wert dann an die referenzierte Aktivität zurückgibt?

Hier ist mein Code für Generic Klasse:

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(); 
    } 


} 

}

Antwort

1
  1. wie unten eine Schnittstelle erstellen:

    public interface GPSResourceListener { 
        void onLocationUpdated(Location location); 
    } 
    
  2. Implementieren Sie die obige Schnittstelle in Ihrer Aktivität und Pass seine Instanz zu GPSResource-Konstruktor wie folgt:

    class YourActivity extends AppCompatActivity implements GPSResourceListener { 
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
         GPSResource gpsResource = new GPSResource(getApplicationContext(), this); 
        } 
    } 
    
  3. die folgenden Änderungen in GPSResource Klasse:

    ... 
    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); 
        } 
    } 
    
Verwandte Themen