【问题标题】:Declaring new instance of Object results in OutOfMemoryFailure. Why?声明 Object 的新实例会导致 OutOfMemoryFailure。为什么?
【发布时间】:2015-09-13 19:27:55
【问题描述】:

我无法理解某些内容。我有一个单独的 Listener 类 (Android),负责处理活动中的所有侦听器。

当我设置一个 onclickListener 时:

.setOnClickListener(new ListenerActivity());

它工作正常。但是,我想创建

public ListenerActivity myListener = new ListenerActivity();

并通过以下方式访问它:

SaveButton.setOnClickListener(myListener);

这应该是有道理的,因为我不是每次都创建一个新的监听器活动的实例,而是创建一个新实例并重新使用它。但是我收到此错误:

java.lang.OutOfMemoryError: Failed to allocate a 600680 byte allocation with 4194304 free bytes and 57MB until OOM; failed due to fragmentation (required continguous free 602112 bytes where largest contiguous free 438272 bytes)
        at android.util.Log.getStackTraceString(Log.java:343)
        at com.android.internal.os.RuntimeInit.Clog_e(RuntimeInit.java:61)
        at com.android.internal.os.RuntimeInit.-wrap0(RuntimeInit.java)
        at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:86)
        at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)
        at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)

为什么这不起作用?

编辑:

这是我的主要课程:

public class EditPageMainActivity extends AppCompatActivity {

这是我的监听类:

public class EditJobListenerActivity extends EditJobMainActivity
    implements AdapterView.OnItemSelectedListener, AdapterView.OnClickListener,
    AdapterView.OnItemClickListener {

【问题讨论】:

  • 这似乎很奇怪,一般你不会自己创建活动,请发布更多代码或解释为什么要创建活动。
  • 不自​​己创建活动是什么意思?老实说,我想要一个不是 Activity 的抽象类,但我遇到了一个问题,为了导入 Toast,我需要实现 50 种其他方法,这就是我使用扩展的原因。稍后我会在编辑中向您展示。
  • 这不是你的做法,请参阅下面的正确方法。如果您设置为静态监听,只需将引用传递给应用程序(而不是活动!)上下文,它就可以显示 toast。
  • 我尝试了 getApplicationContext() 和 getContext() 并且我认为还有一个建议,但它们都没有工作......无论如何我理解我的方式比传统方式少一点,是吗“坏的”?例如,这样做是否会严重阻碍程序?此外,它是否会因为 ListenerActivity 扩展 MainActivity 而出现该错误?
  • 这很糟糕,是的,它会使您的程序陷入困境,因为您正在浪费 RAM。而是创建一个传递应用程序上下文的新类,然后您可以使用它,getContext 仅可从 android 管理的类(活动、服务、广播接收器等)中获得,在其他类中您必须将其提供给您的类。

标签: java android object out-of-memory instantiation


【解决方案1】:

您不应该在 Activity 上调用 new,而是应该让 Android 操作系统为您执行此操作。

SaveButton.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View view) {
      Intent intent = new Intent(this, ListenerActivity.class);
      startActivity(intent);
    }
});

查看docs 了解有关开始活动的详细信息。

【讨论】:

  • 重点是添加 onClick 到每一个按钮、每一个复选框、每一个微调器、所有有点击或选择的东西,或者任何会在视觉上阻碍代码的东西,我会为未来的编辑增加可读性.除非它使程序大小显着更小或更快,否则我的意图是:NewListenerClass 实现 [所有重要的侦听器] { @override public void onClick(View v) { If (v.getId() == x) then y ,等等。
猜你喜欢
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多