为什么Android Studio中代码未逐行执行?fetchPlace回调晚于后续Log.d打印
执行顺序异常原因
这个问题是Android异步任务的典型表现,核心原因如下:
placesClient.fetchPlace()属于异步网络请求方法,调用后不会阻塞当前主线程等待请求返回,只会把请求提交到后台任务队列,立刻继续向下执行后续的同步代码。所以你写在fetchPlace之后的第一行Log.d会立刻执行,这时候网络请求还没完成,addOnSuccessListener的回调还没有被触发,p[0]还是初始的null值。addOnSuccessListener内部的代码属于回调逻辑,只有等后台的地点请求成功返回之后,才会被系统调度到主线程执行,它的执行时机和你当前写的同步代码顺序无关,因此必然晚于后面的那行无延迟Log.d。
不推荐使用固定延迟处理
你当前写的1000ms延迟属于不可靠的处理方案:如果网络环境较差,请求耗时超过1s,延迟后拿到的p[0]依然可能是null;如果请求响应速度很快,又会产生不必要的等待时间。
正确的实现方式是把所有需要用到地点数据的逻辑,都放到addOnSuccessListener回调内部执行,示例如下:
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) -> { Place targetPlace = response.getPlace(); // 所有需要用到地点数据的逻辑都在这里执行 Log.d(TAG, "Place: " + targetPlace); // 比如调用后续业务方法、更新UI等 processPlaceData(targetPlace); }).addOnFailureListener((exception) -> { Log.i(TAG, "Place not found: " + exception.getMessage()); // 处理请求失败场景,比如给用户弹出错误提示 });
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

