גרסה 11.2.0 של Google Play services SDK כוללת דרך חדשה לגשת אל Places SDK for Android. קל יותר להשתמש בלקוח GoogleApi מאשר בגרסה הקודמת שלו (GoogleApiClient), כי הוא מנהל באופן אוטומטי את החיבורים לשירותי Google Play. השימוש ב-SDK הזה מקטין את כמות קוד ה-boilerplate באפליקציה, ויכול לעזור לכם להימנע מטעויות נפוצות רבות. ממשק ה-API החדש כולל כמה שיפורים:
- תהליך החיבור מנוהל באופן אוטומטי, ולכן קל יותר להטמיע את ה-API החדש.
- קריאות ל-API מחכות עכשיו באופן אוטומטי עד שנוצר חיבור לשירות, כך שלא צריך לחכות ל-
onConnectedלפני ששולחים בקשות. - Tasks API מאפשר ליצור בקלות פעולות אסינכרוניות.
- הקוד הוא עצמאי, ואפשר להעביר אותו למחלקה משותפת של כלי עזר או למשהו דומה.
כדי לעדכן את האפליקציה לשימוש בלקוח GoogleApi, צריך לבצע כמה שינויים בהטמעה של Places SDK ל-Android. במדריך הזה מתוארים השינויים ב-Places SDK ל-Android, ומומלצות פעולות שצריך לבצע כשמעדכנים את האפליקציה כדי להשתמש בלקוח החדש.
סקירה כללית
אלה האזורים העיקריים שבהם בוצעו שינויים:
- יש שתי נקודות כניסה חדשות:
GeoDataClientו-PlaceDetectionClient. במקום ליצור מופע אחד שלGoogleApiClientלכל ממשקי ה-API, האפליקציה צריכה ליצור מופע שלGeoDataClientוגם שלPlaceDetectionClient. - מכיוון שאין יותר צורך בהחזרות (callback) של חיבורים, אפשר לבצע רפקטורינג בטוח באפליקציה כדי להסיר אותן.
- השיטות החדשות של Places API הן עכשיו אסינכרוניות, והן מחזירות
TaskולאPendingResult.
טעינת Places API
כדי לטעון את Places API, צריך להצהיר על נקודות הכניסה ואז ליצור מופעים של הלקוחות בשיטה 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