请善待 - 我是新来的!
我正在通过 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/