2011-11-15 5 views
4

다른 언어 (영어, 타밀어 및 힌디어)로 응용 프로그램을 볼 수있는 옵션이 있습니다. 사용자가 원하는 언어에 따라 서체가 설정되는 customtextview를 사용했습니다.out of memory 예외 android

얼마 동안 응용 프로그램을 사용하면 메모리 부족 문제가 발생합니다. 애플리케이션의 모든 텍스트 뷰에 서체 설정에 직접적인 영향이 있습니까? 내 응용 프로그램이 잘 작동,

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) 

현지화 기능없이와 충돌하지 않습니다

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); 
    } 

} 

오류 로그 :

는 텍스트 뷰를 확장하고 CustomTextView의 코드를 부착하게한다.

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> 

나는 로케일을 설정하고있다. 그러나 메모리가 공개되지 않고 응용 프로그램이 열릴 때마다 메모리가 부족하여 결국 응용 프로그램이 중단 될 때만 증가합니다. 나는 또한 네이티브 힙 크기는 언어가 변경 될 때마다 증가에 유지하고, 마지막으로 응용 프로그램이 충돌 사실을 발견

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()); 

} 

:

로 setLocale 방법은 로케일을 변경합니다.

+1

오류 로그를 게시 할 수 있습니까? – user370305

+0

BaseActivity의 레이아웃이나 BaseActivity의 94 행에로드 된 레이아웃을 게시 할 수 있습니까? –

+0

문제가 실제로 다른 곳, 즉 서체와 관련이 없다고 생각됩니다. 로켈 변경은 단순히 메모리 부족 문제를주의를 끌기 만합니다. 기억에 남은 것은 무엇입니까? DDMS를 사용하여 찾을 수 있습니다. –

답변

0

메모리 분석 도구 (MAT)는 메모리가 어디로 가고 있는지 알아내는 데 유용합니다. 흔히 실제 문제가있는 곳에서 충돌이 발생하지 않는 경우가 종종 있습니다.

http://eclipse.org/mat/

당신은 이클립스의 DDMS보기 (가비지 수집을 트리거 한 후 "업데이트 힙"버튼을 사용하여)에서 직접 메모리를 덤프 할 수 있습니다. 이 도구를 이해하는 데는 약간의 시간이 걸릴 수 있지만 무기고에 넣는 것이 중요합니다.

현재, 로케일과 관련된 메모리 부족 예외 문제가 있습니다. 내 문제는 내가 로케일을 변경하기 위해 작업을 다시로드하고, 한 인스턴스에서 새 로케일을로드하지 못했고 메모리가 부족해질 때까지 계속 다시로드한다는 것입니다.

+0

나는 몇개의 listview를 가지고있다. 언어가 설정되면 다음을 사용하여 응용 프로그램을 다시 시작합니다. 의도 i = getBaseContext(). getPackageManager() .getLaunchIntentForPackage (getBaseContext(). getPackageNam()); i.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity (i); 그러나 할당 된 이전 메모리는 응용 프로그램이 다시로드 되더라도 해제되지 않습니다. – Maggi

+0

그 노력에 갈 필요가 있습니까? 나는 이것을 다음과 같이한다. Intent restartIntent = new Intent (this, this.getClass()); restartIntent.setAction (의도.ACTION_CONFIGURATION_CHANGED); startActivity (restartIntent); finish(); – ProjectJourneyman