2013-01-31 1 views
3

하나의 활동이 웹 뷰 (이미지가있는 sdcard의 html 파일 사용), imageviews, scroll과 같은 단일 레이아웃에서 부풀려진 매우 복잡한 코드 인 앱에서 작업하고 있습니다.이 활동을 시작하려면 이러한 오류가 발생합니다.android 응용 프로그램에서 활동을 시작하는 중 메모리 부족 오류가 발생합니까?

 E/AndroidRuntime(600): Caused by: java.lang.reflect.InvocationTargetException 
     E/AndroidRuntime(600): at java.lang.reflect.Constructor.constructNative(Native Method) 
     E/AndroidRuntime(600): at java.lang.reflect.Constructor.newInstance(Constructor.java:417) 
     E/AndroidRuntime(600): at android.view.LayoutInflater.createView(LayoutInflater.java:586) 
     E/AndroidRuntime(600): ... 29 more 
     E/AndroidRuntime(600): Caused by: java.lang.OutOfMemoryError 
     E/AndroidRuntime(600): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 
     E/AndroidRuntime(600): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:483) 
     E/AndroidRuntime(600): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:351) 
     E/AndroidRuntime(600): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:773) 
     E/AndroidRuntime(600): at android.content.res.Resources.loadDrawable(Resources.java:1935) 
     E/AndroidRuntime(600): at android.content.res.TypedArray.getDrawable(TypedArray.java:601) 
     E/AndroidRuntime(600): at android.view.View.<init>(View.java:2785) 
     E/AndroidRuntime(600): at android.view.View.<init>(View.java:2722) 
     E/AndroidRuntime(600): at android.view.ViewGroup.<init>(ViewGroup.java:379) 
     E/AndroidRuntime(600): at android.widget.RelativeLayout.<init>(RelativeLayout.java:174) 
     E/AndroidRuntime(600): ... 32 more 

이 문제를 해결하는 방법이 코드를 시도했지만 여전히 무엇을 해야할지 모릅니다.

@Override 
    protected void onDestroy() { 
    super.onDestroy(); 

    unbindDrawables(findViewById(R.id.rootView)); 
    System.gc(); 
    } 

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

이 문제를 해결할 수있는 방법은 무엇입니까? onPause에서

((BitmapDrawable) myImageView.getDrawable()).getBitmap().recycle(); 
myImageView = null; 

사용도 코드 : 귀하의 경우 비트 맵 메모리 사용을 최적화 할 수

답변

3

가장 좋은 방법 도와주세요하면 ImageViews의 목록은 모든 이미지 뷰에 대한 호출 마감() 전에을 저장하는 것입니다 코드, 활동의 주요 레이아웃이 ID top_layout 갖는 :. 이미지 픽셀이 제한을 초과하는 경우

@Override 
protected void onPause() { 
    super.onPause(); 
    unbindDrawables(findViewById(R.id.top_layout)); 
    System.gc(); 
} 
1

당신은에서 OutOfMemoryException을 얻기를

(최대 해상도 2048 * 2048) 활동에 이미지를 사용하는 동안

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inSampleSize = 4; 
Bitmap myBitmap = BitmapFactory.decodeFile(mUri.getPath(),options); 
Drawable d = new BitmapDrawable(Resources.getSystem(),myBitmap); 
updateDrawable(d); 

을 자신의 해상도를 감소 -

당신은 Bitmapfactory.Options를 사용하여 이미지의 픽셀을 줄일 수 있습니다.

주 - inSampleSize = 2는 크기를 1/2로 줄이고 해상도를 1/4로 줄임을 의미합니다.

inSampleSize 값을 2로 유지하면 최상의 결과를 얻을 수 있습니다.

희망, 그것은 당신을 위해 밖으로 작동합니다. 모든 쿼리, 제발 의견.

+0

활동이 실행될 때마다 사용되는 이미지의 수가 가변적 일 때 어떻게 사용합니까? – Navdroid

+0

이미지를 설정할 때 각 이미지의 속성을 변경하려면이 옵션을 사용하십시오. 또는 파일을 응용 프로그램 파일 시스템에 저장하는 동안이 옵션을 사용할 수도 있습니다. –

2

위의 답변을 검색 한 후 Android 사용자의 코드를 수정하여 간단한 스 니펫을 작성했습니다.이 코드는 성공적으로 작동합니다.이 코드는 setCallback 명령을 사용하여 현재의 모든 비트 맵을 재활용합니다.

 @Override 
     protected void onDestroy() { 
     super.onDestroy(); 

     unbindDrawables(findViewById(R.id.rootView)); 
     System.gc(); 
     } 

static void unbindDrawables(View view) { 
    try{ 
    System.out.println("UNBINDING"+view); 
      if (view.getBackground() != null) { 

       ((BitmapDrawable)view.getBackground()).getBitmap().recycle(); 


       view.getBackground().setCallback(null); 
       view=null; 
      } 

      if (view instanceof ViewGroup) { 
       for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { 
       unbindDrawables(((ViewGroup) view).getChildAt(i)); 
       } 
      ((ViewGroup) view).removeAllViews(); 
      } 

    }catch (Exception e) { 
     // TODO: handle exception 
     e.printStackTrace(); 
    } 
} 

편집 :

내가 크기의 20킬로바이트보다 적은 이미지를 사용하여 오늘 발견 된 새로운 것은 메모리 최적화를위한 좋은 적은 u는 메모리 부족 오류를 통과해야합니다.

+0

어디에서 새 작업을 시작하고이 작업을 마칩니다()? – Nazerke

관련 문제