首页 > 解决方案 > 为什么在 Android Studio 中不会逐行执行?

问题描述

我创建了一个Place[]类型数组p来存储通过fetchPlace()方法获得的地方。我刚刚展示了我必须调用的函数的一些代码行。但是当我调用这个函数时,第一logd行首先执行,它显示的值为p[0]as null。由于取一个地方需要一些时间,所以我推迟了第二logd行。这里,p[0] 不为空。请看下面的代码:

final Place[] p = new Place[1];

final String placeId = place.get("place_id");

        final List<Place.Field> placeFields = Arrays.asList(
                Place.Field.PHONE_NUMBER,
                Place.Field.LAT_LNG
        );

        final FetchPlaceRequest request = FetchPlaceRequest.newInstance(placeId, placeFields);

        placesClient.fetchPlace(request).addOnSuccessListener((response) -> {

            p[0] = response.getPlace();
            
        }).addOnFailureListener((exception) -> {
            Log.i(TAG, "Place not found: " + exception.getMessage());
        });

        Log.d(TAG, "Place: " + p[0]);
        
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Log.d(TAG, "Place Delayed: " + p[0]);
            }
        }, 1000);

这是两个logd输出: 1st : D/MapsFragment: Place: null 2nd :D/MapsFragment: Place Delayed: Place{address=null, addressComponents=null, businessStatus=null, attributions=[], id=null, latLng=lat/lng: (19.0255944,73.0935353), name=null, openingHours=null, phoneNumber=+91 1800 208 1234, photoMetadatas=null, plusCode=null, priceLevel=null, rating=null, types=null, userRatingsTotal=null, utcOffsetMinutes=null, viewport=null, websiteUri=null}

我想问为什么里面的代码在它下面的addOnSuccessListener之前没有运行logd?提前致谢 !

标签: javaandroid-studiogoogle-places-api

解决方案


纳法拉的评论实际上总结得很好。

[...] 传递给 addOnSuccessListener 的代码是专门留出的,只有在成功发生时才运行。您添加监听器,并在调用监听器之前立即打印 p 的值

您的 OnSuccessListener 仅在位置查找实际成功时才会执行。但是,您的代码继续执行并导致p[0]为空。

我不熟悉 Google Places API 或 Android 开发,但从docs / 2来看,如果你不使用它,你应该不需要监听器。

只需正常提交您的任务并等待结果可用。

Task<FetchPlaceResponse> fetchPlaceRequest = placesClient.fetchPlace(request);

while (true) {
  Thread.sleep(100);
  try {
    TResult result = fetchPlaceRequest.getResult();
    p[0] = result.getPlace();
    break;
  } catch (IllegalStateException ise) {} catch (InterruptedException ie) {
    break;
  }
}

添加了睡眠功能以避免高 CPU 使用率。但是,这是我的通用 Java 方法,因为我不熟悉 API / 环境。


推荐阅读