ย้ายข้อมูลไปยังไคลเอ็นต์ GoogleApi

การเปิดตัว SDK ของบริการ Google Play เวอร์ชัน 11.2.0 มีวิธีใหม่ในการเข้าถึง Places SDK สำหรับ Android GoogleApi ไคลเอ็นต์ใช้งานง่ายกว่ารุ่นก่อนหน้า (GoogleApiClient) เนื่องจากจะจัดการการเชื่อมต่อกับบริการ Google Play โดยอัตโนมัติ ซึ่งจะช่วยลดปริมาณโค้ดมาตรฐาน ในแอป และช่วยหลีกเลี่ยงข้อผิดพลาดที่พบบ่อยได้ API ใหม่ มีการปรับปรุงหลายอย่าง ดังนี้

  • ระบบจะจัดการกระบวนการเชื่อมต่อโดยอัตโนมัติ ดังนั้น API ใหม่จึงใช้งานได้ง่ายขึ้น
  • ตอนนี้การเรียก API จะรอให้สร้างการเชื่อมต่อบริการโดยอัตโนมัติ จึงไม่จำเป็นต้องรอ onConnected ก่อนที่จะส่งคำขอ
  • Tasks API ช่วยให้การเขียนการดำเนินการแบบไม่พร้อมกันง่ายขึ้น
  • โค้ดนี้มีอยู่ในตัวและสามารถย้ายไปยังคลาสยูทิลิตีที่แชร์หรือคลาสที่คล้ายกันได้

การอัปเดตแอปเพื่อใช้ไคลเอ็นต์ GoogleApi ต้องมีการเปลี่ยนแปลงการติดตั้งใช้งาน Places SDK สำหรับ Android คู่มือนี้อธิบายการเปลี่ยนแปลงใน Places SDK สำหรับ Android และแนะนำขั้นตอนที่ควรทำเมื่ออัปเดตแอปเพื่อใช้ไคลเอ็นต์ใหม่

ภาพรวม

การเปลี่ยนแปลงหลักๆ มีดังนี้

  • โดยมีจุดแรกเข้าใหม่ 2 จุด ได้แก่ GeoDataClient และ PlaceDetectionClient ตอนนี้แอปของคุณต้องสร้างอินสแตนซ์ทั้ง GeoDataClient และ PlaceDetectionClient แทนที่จะสร้างอินสแตนซ์ GoogleApiClient เพียงอินสแตนซ์เดียวเพื่อครอบคลุม API ทั้งหมด
  • เนื่องจากไม่จำเป็นต้องใช้การเรียกกลับของการเชื่อมต่ออีกต่อไป คุณจึงสามารถรีแฟกเตอร์ แอปเพื่อนำออกได้อย่างปลอดภัย
  • ตอนนี้เมธอด Places API ใหม่เป็นแบบอะซิงโครนัสแล้ว และจะแสดงผล Task แทน PendingResult

โหลด Places API

หากต้องการโหลด Places API ให้ประกาศจุดแรกเข้า แล้วสร้างอินสแตนซ์ของไคลเอ็นต์ในเมธอด onCreate() ของ Fragment หรือกิจกรรม ดังที่แสดงในตัวอย่างต่อไปนี้

// 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 API