【问题标题】:out of memory exception android内存不足异常android
【发布时间】:2011-11-17 21:48:53
【问题描述】:

我可以选择以不同的语言查看我的应用程序 - 英语、泰米尔语和印地语。我使用了 customtextview,根据用户想要的语言设置字体。

当应用程序使用一段时间后,我出现内存不足异常。为应用程序中的所有文本视图设置字体是否有直接影响?

附上扩展Textview的CustomTextView的sn-p代码:

  public L10nTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.ttfName = ttfFileName;
    init();
}

private void init() {
    if (ttfName != null) {
        setTypeface(MyApplication.typeFace);
    } else {
        setTypeface(null);
    }

}

错误日志:

11-15 20:08:50.527: ERROR/AndroidRuntime(2731): FATAL EXCEPTION: main
11-15 20:08:50.527: ERROR/AndroidRuntime(2731): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
11-15 20:08:50.527: ERROR/AndroidRuntime(2731):     at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
11-15 20:08:50.527: ERROR/AndroidRuntime(2731):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:460)
11-15 20:08:50.527: ERROR/AndroidRuntime(2731):     at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336)
11-15 20:08:50.527: ERROR/AndroidRuntime(2731):     at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
11-15 20:08:50.527: ERROR/AndroidRuntime(2731):     at android.content.res.Resources.loadDrawable(Resources.java:1709)
11-15 20:08:50.527: ERROR/AndroidRuntime(2731):     at android.content.res.Resources.getDrawable(Resources.java:581)
11-15 20:08:50.527: ERROR/AndroidRuntime(2731):     at com.android.internal.policy.impl.PhoneWindow.generateLayout(PhoneWindow.java:2226)
11-15 20:08:50.527: ERROR/AndroidRuntime(2731):     at com.android.internal.policy.impl.PhoneWindow.installDecor(PhoneWindow.java:2261)
11-15 20:08:50.527: ERROR/AndroidRuntime(2731):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:203)
11-15 20:08:50.527: ERROR/AndroidRuntime(2731):     at android.app.Activity.setContentView(Activity.java:1657)
11-15 20:08:50.527: ERROR/AndroidRuntime(2731):     at com.techjini.tvguide.android.activity.BaseActivity.setContentView(BaseActivity.java:94)
11-15 20:08:50.527: ERROR/AndroidRuntime(2731):     at com.techjini.tvguide.android.activity.ProgramNextAiringActivity.onCreate(ProgramNextAiringActivity.java:23)
11-15 20:08:50.527: ERROR/AndroidRuntime(2731):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
11-15 20:08:50.527: ERROR/AndroidRuntime(2731):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
11-15 20:08:50.527: ERROR/AndroidRuntime(2731):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
11-15 20:08:50.527: ERROR/AndroidRuntime(2731):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
11-15 20:08:50.527: ERROR/AndroidRuntime(2731):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
11-15 20:08:50.527: ERROR/AndroidRuntime(2731):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-15 20:08:50.527: ERROR/AndroidRuntime(2731):     at android.os.Looper.loop(Looper.java:130)
11-15 20:08:50.527: ERROR/AndroidRuntime(2731):     at android.app.ActivityThread.main(ActivityThread.java:3683)
11-15 20:08:50.527: ERROR/AndroidRuntime(2731):     at java.lang.reflect.Method.invokeNative(Native Method)
11-15 20:08:50.527: ERROR/AndroidRuntime(2731):     at java.lang.reflect.Method.invoke(Method.java:507)
11-15 20:08:50.527: ERROR/AndroidRuntime(2731):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
11-15 20:08:50.527: ERROR/AndroidRuntime(2731):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
11-15 20:08:50.527: ERROR/AndroidRuntime(2731):     at dalvik.system.NativeStart.main(Native Method)

没有本地化功能,我的应用程序可以正常工作并且不会崩溃。

base_layout.xml:

 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/header_bar_layout" android:visibility="visible"
 android:layout_width="fill_parent" android:layout_height="fill_parent"
 android:orientation="vertical">
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/header_bar" android:visibility="visible"
    android:layout_width="fill_parent" android:layout_height="wrap_content">
    <ImageView android:id="@+id/header_click"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:src="@drawable/before" android:layout_alignParentRight="true" />
    <ProgressBar android:id="@+id/prg_bar"
        android:layout_toLeftOf="@id/header_click" android:layout_width="25dip"
        android:layout_height="25dip" android:layout_centerVertical="true"
        android:visibility="gone" />
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/logo_layout" android:orientation="horizontal"
        android:layout_alignParentLeft="true" android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:visibility="visible">
        <ImageView android:id="@+id/logo_bar"
            android:layout_alignParentLeft="true" android:layout_height="wrap_content"
            android:src="@drawable/logo_bar" android:layout_width="wrap_content" />
    </LinearLayout>
    <LinearLayout android:id="@+id/rating"
        android:orientation="horizontal" android:layout_alignParentLeft="true"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:visibility="invisible">
        <ImageView android:id="@+id/rate_us" android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:src="@drawable/rate_us" />
        <ImageView android:id="@+id/like_us" android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:src="@drawable/fb_like_us" />
        <ImageView android:id="@+id/follow_us"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:src="@drawable/twitter_follow_us" />
    </LinearLayout>
  </RelativeLayout>
</LinearLayout>

更改语言时我正在设置语言环境,重新启动我的应用程序。但是内存并没有被释放,每次我的应用程序打开它只会在最终应用程序由于内存不足而崩溃时增加。

Setlocale 方法更改语言环境:

    public void setLocale(String languageLocaleToLoad) {
    Locale locale = new Locale(languageLocaleToLoad);

    Locale.setDefault(locale);

    android.content.res.Configuration config = new android.content.res.Configuration();

    config.locale = locale;

    getResources().updateConfiguration(config,
            getResources().getDisplayMetrics());

}

我还发现,每当更改语言时,本机堆大小会不断增加,最终应用程序崩溃。

【问题讨论】:

  • 您能否发布您的 BaseActivity 的布局或在您的 BaseActivity 第 94 行加载的布局?
  • 我怀疑您的问题实际上出在其他地方,即与字体无关。语言环境更改只是引起您注意内存不足的问题。你还有什么记忆?您可以使用 DDMS 找出答案。

标签: android


【解决方案1】:

内存分析器工具 (MAT) 有助于找出内存的去向。通常,崩溃并不完全发生在真正的问题所在。

http://eclipse.org/mat/

您可以直接从 Eclipse 的 DDMS 视图中转储内存(使用“更新堆”按钮,然后触发垃圾收集)。了解该工具可能需要一点时间,但它是您的武器库中的重要工具。

顺便说一句,我也遇到了与语言环境相关的内存不足异常问题。我的问题是我重新加载了活动以更改语言环境,在一种情况下,它无法加载新的语言环境并不断重新加载,直到内存不足。

【讨论】:

  • 我有几个列表视图。设置语言后,我将使用以下命令重新启动应用程序: Intent i = getBaseContext().getPackageManager() .getLaunchIntentForPackage( getBaseContext().getPackageNam() ); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);开始活动(一);但是即使重新加载应用程序,之前分配的内存也不会被释放。
  • 你需要付出努力吗?我只是这样做: Intent restartIntent = new Intent(this, this.getClass()); restartIntent.setAction(Intent.ACTION_CONFIGURATION_CHANGED); startActivity(restartIntent);完成();
猜你喜欢
  • 2012-10-24
  • 2023-03-06
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 2010-10-05
相关资源
最近更新 更多