java - 为什么在 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
?提前致谢 !
解决方案
纳法拉的评论实际上总结得很好。
[...] 传递给 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 / 环境。
推荐阅读
- c - 为什么在c中将指针转换为双指针?
- sql - Greoupby 与 Max() 条件 SQL Teradata
- python - 有没有办法改变ezdxf中的背景颜色?
- python - ([False, True] 和 [True, True]) 计算结果为 [True, True]
- android - NullPointerException 试图使用 ActionBarDrawerToggle
- python - 在控制台的标题中放置一个变量(Python)
- swift - 从其中的按钮中删除 tableview 单元格
- php - 在 Laravel 7 中检索模型并更新其(多态)相关模型
- f# - 在 F# 中,可以在命名空间内的模块中公开记录类型吗?
- javascript - API [未处理的承诺拒绝:TypeError:网络请求失败]