当我使用Places.GeoDataApi.getPlaceById()
LeakCanary 时检测到我的一个实例Activity
已泄漏。
这是 LeakCanary 报告的内容
* com.mypackage.PlaceSearchActivity has leaked:
* GC ROOT com.google.android.gms.location.places.zzl.mContext
* leaks com.mypackage.PlaceSearchActivity instance
这是我的代码。这两种方法都在 my 中声明PlaceSearchActivity
。
void lookupLatLng(final Location location, final int followUpAction) {
Task.callInBackground(new Callable<LatLng>() {
@Override
public LatLng call() throws Exception {
PlaceBuffer places = Places.GeoDataApi.getPlaceById(
getGoogleApiClient(), location.getPlaceId()).await();
LatLng result = places.get(0).getLatLng();
places.release();
return result;
}
}).continueWithTask(new Continuation<LatLng, Task<Void>>() {
@Override
public Task<Void> then(Task<LatLng> task) throws Exception {
if (task.isFaulted()) {
// TODO Place lookup failed
} else if (task.isCompleted()) {
switch (followUpAction) {
case ACTION_PICK:
location.setLatLngPoint(LatLngPoint.from(task.getResult()));
onLocationSelected(location);
break;
}
}
return task.makeVoid();
}
}, Task.UI_THREAD_EXECUTOR);
}
void onLocationSelected(Location location) {
Intent resultIntent = new Intent();
resultIntent.putExtra(EXTRA_RESULT, Parcels.wrap(location));
setResult(RESULT_OK, resultIntent);
ActivityCompat.finishAfterTransition(this);
}
我不确定是什么导致了问题。任何帮助表示赞赏。谢谢!
更新:还使用以下代码检测到内存泄漏。
void lookupLatLng(Location location) {
Places.GeoDataApi.getPlaceById(getGoogleApiClient(), location.getPlaceId()).setResultCallback(
new ResultCallback<PlaceBuffer>() {
@Override
public void onResult(PlaceBuffer places) {
Place place = places.get(0);
LatLng latLng = place.getLatLng();
places.release();
}
}
);
}
这可能是PlayServices
图书馆内的问题。我将在一个空项目上对此进行测试,以验证问题。