מעבר ל-GoogleApi Client

במהדורה 11.2.0 של Google Play services SDK יש דרך חדשה לגשת ל-Places SDK ל-Android. קל יותר להשתמש בלקוח GoogleApi מאשר בקודמו (GoogleApiClient), כי הוא מנהל באופן אוטומטי את החיבורים ל-Google Play Services. כך תוכלו לצמצם את כמות הקוד הסטנדרטי באפליקציה, וכך למנוע הרבה מהמלכודות הנפוצות. ממשק ה-API החדש כולל כמה שיפורים:

  • תהליך החיבור מנוהל באופן אוטומטי, כך שהטמעת ה-API החדשה קלה יותר.
  • קריאות ל-API ממתינות עכשיו באופן אוטומטי ליצירת החיבור לשירות, כך שאין צורך להמתין ל-onConnected לפני שליחת הבקשות.
  • Tasks API מאפשר ליצור בקלות פעולות אסינכרניות.
  • הקוד הוא עצמאי, וניתן להעביר אותו לכיתה שיתופית של שירותים או למקום דומה.

כדי לעדכן את האפליקציה כך שתשתמש בלקוח GoogleApi, צריך לבצע כמה שינויים בהטמעה של Places SDK ל-Android. במדריך הזה מתוארים השינויים ב-Places SDK ל-Android, ומפורטות ההמלצות לביצוע כשמעדכנים את האפליקציה כך שתשתמש בלקוח החדש.

סקירה כללית

אלה תחומי השינוי העיקריים:

  • יש שתי נקודות כניסה חדשות: GeoDataClient ו-PlaceDetectionClient. במקום ליצור מופע אחד של GoogleApiClient כדי לכסות את כל ממשקי ה-API, האפליקציה צריכה ליצור עכשיו מופע של GeoDataClient וגם של PlaceDetectionClient.
  • מאחר שכבר אין צורך בקריאות חזרה (callbacks) של חיבורים, אפשר לבצע רפרסוקציה של האפליקציה כדי להסיר אותן בבטחה.
  • השיטות החדשות של Places API הן עכשיו אסינכרוניות, והן מחזירות Task במקום PendingResult.

טעינת Places API

כדי לטעון את Places API, מגדירים את נקודות הכניסה ואז יוצרים את הלקוחות ב-method‏ onCreate() של הפעילות או של הפלח, כפי שמתואר בדוגמה הבאה:

// The entry points to the Places API.
private GeoDataClient mGeoDataClient;
private PlaceDetectionClient mPlaceDetectionClient;

...
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Construct a GeoDataClient.
    mGeoDataClient = Places.getGeoDataClient(this, null);

    // Construct a PlaceDetectionClient.
    mPlaceDetectionClient = Places.getPlaceDetectionClient(this, null);

השוואה

השיטות החדשות של Places API הן עכשיו אסינכרוניות, והן מחזירות Task במקום PendingResult. מבני הנתונים לא השתנו, כך שלא צריך לעדכן את הקוד הקיים לטיפול בתוצאות. דוגמאות הקוד הבאות משוות בין הגרסה החדשה לבין הגרסה הקודמת של GetCurrentPlace():

הדרך החדשה

Task<PlaceLikelihoodBufferResponse> placeResult = mPlaceDetectionClient.getCurrentPlace(null);
placeResult.addOnCompleteListener(new OnCompleteListener<PlaceLikelihoodBufferResponse>() {
    @Override
    public void onComplete(@NonNull Task<PlaceLikelihoodBufferResponse> task) {
        PlaceLikelihoodBufferResponse likelyPlaces = task.getResult();
        for (PlaceLikelihood placeLikelihood : likelyPlaces) {
            Log.i(TAG, String.format("Place '%s' has likelihood: %g",
                placeLikelihood.getPlace().getName(),
                placeLikelihood.getLikelihood()));
        }
        likelyPlaces.release();
    }
});

הדרך הישנה

PendingResult<PlaceLikelihoodBuffer> result = Places.PlaceDetectionApi
    .getCurrentPlace(mGoogleApiClient, null);
result.setResultCallback(new ResultCallback<PlaceLikelihoodBuffer>() {
  @Override
  public void onResult(PlaceLikelihoodBuffer likelyPlaces) {
    for (PlaceLikelihood placeLikelihood : likelyPlaces) {
      Log.i(TAG, String.format("Place '%s' has likelihood: %g",
          placeLikelihood.getPlace().getName(),
          placeLikelihood.getLikelihood()));
    }
    likelyPlaces.release();
  }
});

מידע נוסף

מידע נוסף על גישה ל-Google APIs