【问题标题】:Android Maps Activity memory issueAndroid Maps Activity 内存问题
【发布时间】:2020-07-21 16:01:18
【问题描述】:

我正在制作一个带有谷歌地图活动的应用程序,并在其上显示叠加层和标记。这些标记是可点击的,它们会转到另一个活动,其中包含有关该位置的信息。用户从此活动返回到地图活动。当对此进行测试并在地图活动和信息活动之间来回切换时,大约在第 8 次返回地图活动时,它会崩溃。在使用 Android Studio 中的分析器进行进一步调查后,我注意到每当我返回地图活动时,内存使用量都会大幅增加,而且不会下降。就像每次您重新打开地图活动时,它都会在之前加载的内容之上重新加载我在 onCreate 调用中启动的所有内容。这会很奇怪,因为我在转到信息活动时不会破坏 MapS 活动,所以它不应重新加载所有图像和变量。分析器还说 Maps 活动只是停止并没有被破坏。 返回主菜单时,我尝试使用 MapS.super.finish 来查看 GC 是否会释放内存,但不会。

MapS 活动

public class MapS extends AppCompatActivity implements OnMapReadyCallback {

    private GoogleMap mMap;
    private FusedLocationProviderClient mFusedLocationProviderClient;
    private Location mLastKnownLocation;
    private LocationCallback locationCallback;
    private final float DEFAULT_ZOOM = 18;
    private View mapView;
    private Overlay[] floor0;
    private Overlay[] floor1;
    private int height = 120;
    private int width = 90;
    private HashMap<String,Bitmap> icons = new HashMap<>();
    Circle mapCircle = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);


        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.MapS);
        assert mapFragment != null;
        mapFragment.getMapAsync(this);
        mapView = mapFragment.getView();

        mFusedLocationProviderClient = getFusedLocationProviderClient(MapS.this);
        Places.initialize(MapS.this, ("MY API KEY GOES HERE"));

HERE I DEFINE SOME BUTTONS AND I CREATE MY OVERLAY OBJECTS (THESE CONTAIN A BITMAPDESCRIPTORFACTORY,COORDINATES AND SOME INTEGERS)

WHEN THE BUTTONS GO TO ANOTHER ACTIVITY THAN THE INFO ACTIVITY OF A LOCATION, I DO MapS.super.finish() TO DESTROY THE MAPS ACTIVITY

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 51) {
            if (resultCode == RESULT_OK) {
                getDeviceLocation();

            }
        }
    }

    @SuppressLint("MissingPermission")
    private void getDeviceLocation() {
        GET DEVICE LOCATION
    }


    @Override
    public void onMapReady(final GoogleMap googleMap) {
        googleMap.clear();

        //This is the part that initializes the overlays and the markers
        //display floor 0 at the start
        HERE I HAVE THE CODE THAT ADDS THE OVERLAYS TO THE MAP? LET'S THE USER SWITCH BETWEEN FLOORS AND ADDS THE MARKERS, IT ALSO CHECKS IF THE USER IS INSIDE A CERTAIN RANGE OF A MARKER AND IF SO HE CAN CLICK THE MARKER AND GO TO IT'S INFO ACTIVITY


    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        Runtime.getRuntime().gc();
    }
}

【问题讨论】:

标签: java android google-maps memory


【解决方案1】:

我认为我解决了最大的问题,因为它现在可以使用,并且在分析器中似乎没有大的内存问题。从地图活动到信息活动我没有清除地图,所以当用户返回地图时,它会重新加载顶部的所有内容。使用 LeakCanary 时,我仍然收到泄漏警告: 报告 LeakCanary:

┬───
│ GC Root: Global variable in native code
│
├─ com.google.android.gms.internal.location.zzat instance
│    Leaking: UNKNOWN
│    ↓ zzat.zzda
│           ~~~~
├─ com.google.android.gms.common.api.internal.ListenerHolder instance
│    Leaking: UNKNOWN
│    ↓ ListenerHolder.zajk
│                     ~~~~
├─ com.kulak.discoverkoelak.MapS$8 instance
│    Leaking: UNKNOWN
│    Anonymous subclass of com.google.android.gms.location.LocationCallback
│    ↓ MapS$8.this$0
│             ~~~~~~
╰→ com.kulak.discoverkoelak.MapS instance
​     Leaking: YES (ObjectWatcher was watching this because com.kulak.discoverkoelak.MapS received Activity#onDestroy() callback and Activity#mDestroyed is true)
​     key = 7b56a75c-cafa-4963-8d7f-27eb78fb3efc
​     watchDurationMillis = 5131
​     retainedDurationMillis = 128

如果有人知道是什么原因,请随时在此问题下方回答。

【讨论】:

    猜你喜欢
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    相关资源
    最近更新 更多