首页 > 解决方案 > 在 Android Studio 中使用处理会导致内存泄漏

问题描述

请善待 - 我是新来的!

我正在通过 PApplet 在 Android Studio 中使用处理(根据此处详述的处理示例:https ://android.processing.org/tutorials/android_studio/index.html )

在 Android Studio 中,我有 2 个活动(MainActivity 和 Screen2),单击 MainActivity 中的按钮会调用 Screen2。从 Screen2 我希望能够点击手机的后退按钮以返回 MainActivity。

好的,它确实有效......但根据 Android Profiler,我有内存泄漏,并且通过反复打开和关闭 Screen2(最终)我得到内存不足错误并且应用程序崩溃。

我已经检查过 Google、StackOverflow 等,并且知道 onStop 和 onDestroy 方法以及活动和片段的生活方式,但我显然没有正确使用它们,因为我无法阻止泄漏(我无处可去,所以甚至没有包括这些方法在这里)

以下是类文件的内容:

MainActivity.java

package com.example.test;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

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


public void jump(View v){
   Intent i = new Intent(this, Screen2.class);
    startActivity(i);
}
}

(我通过activity_main.xml中按钮的onClick属性调用跳转方法)

Screen2.java

package com.example.test;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import processing.android.CompatUtils;
import processing.android.PFragment;
import processing.core.PApplet;

public class Screen2 extends AppCompatActivity {

private PApplet sketch;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FrameLayout frame = new FrameLayout(this);
    frame.setId(CompatUtils.getUniqueViewId());
    setContentView(frame, new 
ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.MATCH_PARENT));

    sketch = new mySketch();
    PFragment fragment = new PFragment(sketch);
    fragment.setView(frame, this);
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
if (sketch != null) {
sketch.onRequestPermissionsResult(requestCode, permissions, rantResults);
}
}

@Override
public void onNewIntent(Intent intent) {
if (sketch != null) {
sketch.onNewIntent(intent);
}
}
}

mySketch.java(处理文件)

package com.example.test;

import processing.core.PApplet;

public class mySketch extends PApplet {

public void settings() {
fullScreen(P3D);
}

public void setup() {
textSize(40);
fill(0);
}

public void draw() {
text("Hello from Processing",100,100);
}
}

Android Profiler 说泄漏在 Java 中,所以我的感觉是,虽然 Screen2 活动正在关闭,但处理草图的片段却没有。我是否需要为此使用 FragmentManager(目前仍然超出我的范围),还是有一种简单的方法可以在 Screen2 活动关闭的同时关闭处理片段并正确释放内存?(我只有 1 个片段)

感谢您的任何帮助...

西蒙

标签: androidandroid-studiomemory-leaksappletprocessing

解决方案


抱歉,我也无法发表评论(Rep<50,不知道他们为什么这样做?)但感谢您回复我。

对依赖项的一个很好的建议,但是是的,我是最新的。

至于多个活动,是的,这个示例似乎毫无意义,但我编写了一个更大的应用程序(具有更大的处理草图),并且看到第二个活动的每个周期有大约 50Mb 的内存泄漏。

我没有让每个人都不必要地涉过这个问题,而是在较小的范围内重新创建了这个问题——因此你在这里看到的这个相当毫无意义的例子。是的,示例代码在这里似乎也运行顺利,我使用示例代码得到的内存泄漏只有 2 Mb 左右,但它仍然是内存泄漏,非常令人气愤……

几年来,我一直在 Android 模式下编写处理草图,但只在独立的处理 IDE 中。我是在 Android Studio 中使用处理的新手,所以我确定这是我对片段做错的事情。

西蒙


推荐阅读