android - 在 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 个片段)
感谢您的任何帮助...
西蒙
解决方案
抱歉,我也无法发表评论(Rep<50,不知道他们为什么这样做?)但感谢您回复我。
对依赖项的一个很好的建议,但是是的,我是最新的。
至于多个活动,是的,这个示例似乎毫无意义,但我编写了一个更大的应用程序(具有更大的处理草图),并且看到第二个活动的每个周期有大约 50Mb 的内存泄漏。
我没有让每个人都不必要地涉过这个问题,而是在较小的范围内重新创建了这个问题——因此你在这里看到的这个相当毫无意义的例子。是的,示例代码在这里似乎也运行顺利,我使用示例代码得到的内存泄漏只有 2 Mb 左右,但它仍然是内存泄漏,非常令人气愤……
几年来,我一直在 Android 模式下编写处理草图,但只在独立的处理 IDE 中。我是在 Android Studio 中使用处理的新手,所以我确定这是我对片段做错的事情。
西蒙
推荐阅读
- python - 打印用户输入生成的字典内容
- android - 如何修复滚动视图崩溃的 Android 应用程序?
- laravel - 其他语句在 Laravel 中返回空白
- python - 尝试根据子字符串从文本文件中打印行
- java - Java xmpp tcp 连接生成器异常:“NoSuchFieldError:ifpossible”
- ruby-on-rails - 使用 git init 时是否重新初始化了现有的 Git 存储库?
- javascript - 使用 Lodash 和 React 对数字字符串进行排序?
- google-maps - 如何在 SwiftUI 中以编程方式在工作表中显示视图?
- sql - 尝试获取并发的最新执行(oracle 11g)
- python - Python 文件加密(字典、文件和异常)