android - 在 Android Studio 中使用 Processing 会导致内存泄漏

标签 android android-studio memory-leaks applet processing

请善待 - 我是新来的!

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

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

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

我查过谷歌、StackOverflow 等,知道 onStop 和 onDestroy 方法以及 Activity 和 fragment 的生活方式,但我显然没有正确使用它们,因为我无法阻止泄漏(我无处可去,所以避风港'甚至在这里包括这些方法)

类文件的内容如下:

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 Activity 正在关闭,但 Processing sketch 的 fragment 没有。我是否需要为此使用 FragmentManager(目前仍然超出我的范围),或者是否有一种简单的方法可以关闭 Processing fragment 并在 Screen2 Activity 关闭的同时正确释放内存? (我只有1个 fragment )

感谢您的帮助...

西蒙

最佳答案

[对不起,我想说这些作为评论,但以我目前的声誉我不能,而且没有其他人回答你的问题,因为我已经分析了示例和你的代码,我将这些作为回答]

在研究了您的代码和您的“Processing for android”链接中提供的两个示例后,这是结论,希望能帮助您找到准确的答案:

您的代码依赖项的更新可能有问题,或者您可能正在使用旧版本的依赖项但使用更新的代码格式。另一件事是我不明白为什么你需要改变 Activity ,只需在主要 Activity 中实现你的代码,看看会发生什么。我的建议是,在您收集到足够的 Processing 知识后,尝试添加更多 Activity 并检查性能问题。

分析两个示例代码,它们在我的模拟器中运行流畅,没有创建 内存泄漏,并且 PApplet 的 PFragment 是内置代码,因此出错的可能性很小,但并非不可能。所以,我最好的猜测是 PFragment 的依赖关系可能有问题。尝试通过添加“实现文件('libs/processing-core.jar')”来更改依赖项,这可以从示例代码 ex2_fragments_sv4“dir:app/libs/processing-core.jar”中找到。 jar ”。

关于android - 在 Android Studio 中使用 Processing 会导致内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57236157/

相关文章:

c++ - 安全使用 vector.emplace_back( new MyPointer ); vector 内部的故障会导致内存泄漏吗?

c++ - 为什么下面的 C++ 赋值时没有内存泄漏?

android - 我无法将AppCompat-v7编译到我的Android Studio项目中

android - 如何使用 libgdx 显示矢量化文本?

android - 如何使用 View 模型单例进行 Activity ?

android - 如何从共享偏好中获取值并使用 if 检查它

java - 如何从 Android 中的 Parse Server 获取字符串

android - 如何在启动时完全停止 Android Studio 索引/扫描/构建?

c++ - std::map 导致内存泄漏?

android - 在 RecyclerView Adapter 中使用 RxJava