1

当我使用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图书馆内的问题。我将在一个空项目上对此进行测试,以验证问题。

4

0 回答 0