小编Gas*_*ias的帖子

当内存不足时,Android不会从堆栈中查杀活动

我们一直在开发一个具有下拉式仪表板的应用程序,该仪表板允许用户在整个应用程序中导航.导航不是很标准,因为几乎每个活动都可以访问此菜单.在使用菜单播放一段时间后,堆栈开始增长和增长.

所有这些活动都包含列表视图,其中包含多个图像视图,每个活动大约需要3mb.如果用户玩得足够并在堆栈上创建了超过25个活动,则会发生以下情况:

  1. 抛出内存不足错误(堆增加直到没有堆).
  2. 由于异常而显示一个对话框(不幸的是,%activity%已停止.)
  3. 抛出异常错误的活动已经完成.
  4. 堆栈中的所有活动都已完成,但历史记录保留,因此可以进行备份,并且每个活动都由操作系统自动重新创建.

我期待系统自动杀死堆栈中最旧的活动BEFRORE抛出OutOfMemoryError ...

为了确保操作系统不会破坏旧活动,我创建了一个每次分配1mb的测试应用程序.猜猜是什么:行为是一样的,抛出了错误的错误:

问题是:如果需要,我们如何告诉Android操作系统允许释放活动及其资源,以便我们不会得到"不幸的是,您的活动已停止".对话?

概念证明

    package com.gaspar.memorytest;

import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MemoryTestActivity extends Activity { /** Called when the activity is first created. */ private byte[] mData; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main1); ((Button)findViewById(R.id.button)).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent i = new Intent(MemoryTestActivity.this, MemoryTestActivity.class); startActivity(i); } }); mData = new byte[1*1024*1024]; } }
Run Code Online (Sandbox Code Playgroud)

android out-of-memory android-activity

8
推荐指数
1
解决办法
3656
查看次数

有没有办法避免在Android中使用instanceOf?

我们都同意使用instanceOf通常不是最好的解决方案.网上有很多例子.

但是让我们考虑一下以下示例,我们需要从一个片段调用一个方法到它的活动:

public class BaseActvity extends FragmentActivity implements ISomething {
    @Override
    public void doSomething();
}
Run Code Online (Sandbox Code Playgroud)

然后假设我们在应用程序中有一个需要调用的片段doSomething():

public MyFragment extends Fragment() {

public void onCreate() {
    public void onResume() {
        Activity activity = getActivity();
        if (activity != null && activity instanceOf ISomething) {
            ISomething something = (ISomething) activity;
            something.doSomething();
        }
    }
}

public interface ISomething {
    void doSomething();
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我们无法保证getActivity()将返回ISomething的对象,因此我们检查类型.一个改进是添加一个接口,但我们仍然要检查getActvity()返回类型以保护我们的代码.

由于Android Framework和getActivity()调用的性质,我找不到更好的解决方案.也许有人可以帮助一些输入..

注意:我添加了一个界面来跟随访问者模式.请注意,我仍然必须使用instanceOf来确保父活动正在实现它.

谢谢 .

Gaspar de Elais

android instanceof

2
推荐指数
1
解决办法
480
查看次数