【问题标题】:How to destroy/release resources used in 1 activity/layout?如何销毁/释放 1 个活动/布局中使用的资源?
【发布时间】:2014-02-15 05:10:07
【问题描述】:

如何释放 1 项活动中使用的资源? 所以我为每个布局获得了 3 个布局和活动,但问题是当我在这些活动之间切换时,我的应用程序崩溃了,我得到了这个:

自从我将添加添加到我的应用程序后,我就开始收到此错误。 我的整个 logcat http://i.imgur.com/t5G94dC.png

XML 布局:

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
    android:id="@+id/RelativeLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#000000" >

      <ImageButton
          android:id="@+id/dugme2"
          android:layout_width="150dp"
          android:layout_height="90dp"
          android:layout_alignBottom="@+id/dugme1"
          android:layout_alignParentRight="true"
          android:background="#0000"
          android:onClick="onClick"
          android:scaleType="fitXY"
          android:src="@drawable/dragunov" />

      <ImageButton
          android:id="@+id/dugme5"
          android:layout_width="150dp"
          android:layout_height="90dp"
          android:layout_alignParentLeft="true"
          android:layout_alignTop="@+id/dugme6"
          android:background="#0000"
          android:onClick="onClick"
          android:scaleType="fitXY"
          android:src="@drawable/scout" />


      <SeekBar
          android:id="@+id/seekSnipers"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:layout_alignParentLeft="true"
          android:layout_alignParentTop="true"
          android:progressDrawable="@drawable/red_scrubber_progress"
          android:thumb="@drawable/red_scrubber_control" />

    <com.google.ads.AdView
            android:id="@+id/adView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            ads:adSize="BANNER"
            ads:adUnitId="ID"
            ads:loadAdOnCreate="true" >
            </com.google.ads.AdView>

</RelativeLayout>

除了资源和 ID 不同之外,其他布局也几乎相同。 每种布局中的广告代码都是相同的。

【问题讨论】:

  • 请分享加载失败的activity的xml布局。
  • 不是 1 个布局/活动加载失败,基本上所有活动都可能崩溃/加载失败。它是这样的:菜单>活动1>菜单>活动2>菜单>活动3>菜单:我打开的任何下一个布局/活动都会崩溃
  • 此错误表示您的 XML 布局中有一个或多个错误,如果您需要帮助,请发布您的 xml 代码;)
  • 我在上面添加了 XML 布局。

标签: android resources release destroy


【解决方案1】:

您可以使用以下代码释放资源。这应该在 u=your activity 的 onDestroy() 中调用。

private void unbindDrawables(View view) {
    if (view.getBackground() != null) {
        view.getBackground().setCallback(null);
    }
    if (view instanceof ViewGroup) {
        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
            unbindDrawables(((ViewGroup) view).getChildAt(i));
        }
        ((ViewGroup) view).removeAllViews();
        view.setBackgroundResource(0);
    }
}

要销毁活动,您应该在调用下一个活动后调用 finish()

【讨论】:

  • 但是如果我有静态视图呢??
  • @DigveshPatel 为什么要使用静态视图?它们必然会泄漏内存。请参阅此帖子:- blog.vogella.com/2013/03/12/…
  • 但是如果想从不同的帮助类中更新我的 textview 文本并且该文本在所有活动中都很常见??
  • 您可以使用在主活动中初始化的静态字符串并使用它来更新文本视图。
【解决方案2】:

您应该使用 OnStop() 回调来释放导致内存泄漏的资源。您还应该使用 onStop() 来执行相对 CPU 密集型的关机操作。

【讨论】:

    猜你喜欢
    • 2020-12-27
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多