0

我正在开发一个非常简单的android 应用程序,它设计有5 个活动,每个活动都有自己的RelativeLayout。

1)父母(或家庭)2-5)家庭的孩子,每个人都有自己的后退按钮,调用finish()。

这是主屏幕的样子

问题: 我在任何地方都使用图像资产,并且通过不断地从父级切换到子级来对应用程序进行压力测试。由于古老的“超出虚拟机预算”错误,我内存不足。!

我尝试过的: 我尝试减少将我的大部分对象设置为静态引用的图像资产,以便在子活动完成时对它们进行垃圾收集。我安装了 MAT 工具来检查 HPROFS 转储,这非常令人困惑。我已阅读有关 SoftReferences 或 WeakReferences 和文件缓存技术的信息,但尚未实现它们。

已编辑...这是我对每个儿童活动的 onDestroy。

@Override
    protected void onDestroy() {
        super.onDestroy();
        // unbind all drawables starting from the first viewgroup
        unbindDrawables(findViewById(R.id.info_layout));
        c2 = null;
        runnable = null;
        mFont = null;
        root = null;
        myThread = null;
        myImage = null;
        v = null;
        txtCurrentTime = null;
        common = null;
        System.gc();
        Log.e("Info", "Info destroyed.");
    }

还...所有这些都在类声明的开头声明为私有。它们是否需要声明为静态或其他?

问题: 我可以使用一种不同类型的布局,它不会涉及在活动上调用完成(),比如 TabHost 或 ViewFlipper 类似的东西......这将阻止我不得不开始一个新活动并完成它

或者也许......当我在我的 Child 活动上调用 finish() 以便所有东西都被垃圾收集时的一种方式?

欢迎使用 XML 和/或代码示例。

我对任何一种方式或任何其他可以建议的方式都持开放态度。

谢谢。瑞克

4

1 回答 1

0

如果您在反复从父级切换到子级后运行 OOM,那么您可能正在泄漏子级活动。我会运行一个 hprof 并确保您没有累积子活动,如果您试图找出哪些引用没有被释放并确保它们在 onDestroy 中为空。

这通常发生在框架有一个指向您的子上下文的指针时,它没有被告知通过取消注册或通过您的应用程序中的某种循环引用(可能通过非静态子类)释放。

于 2013-05-31T19:15:06.450 回答