2013-08-22 5 views
1

도움이 필요합니다. 나는 문제를 찾기 위해 여러 가지를 시도했지만, 나는 여전히 메모리 문제가있다. Here`s 내 코드 :Android : ImageSwitcher의 비트 맵으로 인해 OutOfMemory 오류가 발생합니다.

public class AboutActivity extends Activity implements ViewSwitcher.ViewFactory { 
//private WebView webview; 
static final String BRANDING_PREFS_NAME = "BrandingInfo"; 

int[] imageIds = {0,1,2,3,4,5 }; 
int currentImageIndex = 0; 
//Runnables 
private final Handler handler = new Handler(); 
private ShowNextImageRunnable showNextImage; 
/** Called when the activity is first created. */ 
/**@Override */ 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.about); 

    ImageSwitcher imageSwitcher = (ImageSwitcher)findViewById(R.id.imageSwitcher); 
    imageSwitcher.setFactory(this); 
    imageSwitcher.setImageResource(R.drawable.about); 
    if(brandingInfo.getString("aboutImage0", "").length() > 0 || 
     brandingInfo.getString("aboutImage1", "").length() > 0 || 
     brandingInfo.getString("aboutImage2", "").length() > 0 || 
     brandingInfo.getString("aboutImage3", "").length() > 0 || 
     brandingInfo.getString("aboutImage4", "").length() > 0 || 
     brandingInfo.getString("aboutImage5", "").length() > 0) { 
     handler.postDelayed(showNextImage, 0); 
    } 
} 

@Override 
public void onPause() { 
    super.onPause(); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
} 

public View makeView() { 
     ImageView i = new ImageView(this); 
     i.setBackgroundColor(0xFF000000); 
     i.setScaleType(ImageView.ScaleType.FIT_START); 
     i.setLayoutParams(new ImageSwitcher.LayoutParams(ImageSwitcher.LayoutParams.MATCH_PARENT, 
       ImageSwitcher.LayoutParams.MATCH_PARENT)); 
     i.setAdjustViewBounds(true); 
     return i; 
} 

private boolean showNextImage(int index){ 
    BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inPurgeable = true; 
    options.inInputShareable = true; 
    Bitmap bitmap = null; 
    try { 
     bitmap = BitmapFactory.decodeStream(openFileInput("about"+index+".png"), null, options); 
    } catch (FileNotFoundException e) { 
     return false; 
    } 
    ImageSwitcher imageSwitcher = (ImageSwitcher)findViewById(R.id.imageSwitcher); 
    final ImageView g = (ImageView) imageSwitcher.getCurrentView(); 
    final Bitmap b = bitmap; 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      if (b != null) { 
       g.setImageBitmap(b); 
      } 
     } 
    }); 
    bitmap = null; 
    return true; 
} 

class ShowNextImageRunnable implements Runnable { 

     public void run() { 
     ++currentImageIndex; 
     if(currentImageIndex >= imageIds.length) 
      currentImageIndex = 0; 

     if(!showNextImage(currentImageIndex)) 
      handler.postDelayed(showNextImage, 0); 
     else 
      handler.postDelayed(showNextImage, 3000); 
     } 

    } 

}

이클립스 메모리 분석기는 메모리가 1,3 MB와 바이트 []에 축적된다, 저를 보여줍니다. 비트 맵의 ​​크기가 문제가됩니까? 기억이 왜 자랄지 모르겠다.

BitmapFactory 클래스의 "decodeStream()"함수에서 오류가 발생합니다.

희망을 보내 주시면 감사하겠습니다.

편집 : 각 비트 맵의 ​​크기는 ~ 1,3MB입니다. 크기가 클 수도 있습니다. 어떻게 imageswitcher에 대한 비트 맵 캐싱을 구현할 수 있습니까? 나는 6 개의 이미지를 갖고 있으며, 매 3 초마다 이미지를로드합니다. 나는 "public static LRU-CACHE"에 대해 생각했다.

+0

너무 많은 메모리를 사용하는 총 앱입니다. 크기가 너무 큰 비트 맵을 너무 많이로드하는 것 같습니다. 비트 맵은 얼마나 큽니까? 또한 캐싱을 구현하여 오래된 비트 맵을 유지하거나 이전의 비트 맵을 명시 적으로 재활용하지 않도록 할 수 있습니다. –

+0

안녕하세요, 이미지의 크기는 ~ 1,3MB입니다. 그게 큰가요? 캐싱을 구현하는 방법에 대한 팁을 알려주시겠습니까? Thx –

+0

그들 중 하나가 아니라, 그들 중 많은 수 있습니다. 캐싱에 대해서는 지원 라이브러리에있는 LRUCache를보십시오. –

답변

0

테스트 할 Android 버전에 따라 비트 맵과 관련된 문제가 발생할 수 있습니다. 실제 픽셀 데이터는 가비지 수집되지 않으므로 사용되지 않는 Bitmap 객체에 대해 리사이클 메소드를 명시 적으로 호출해야합니다 (이는 이후 Android 버전에서 수정되었습니다).

다음 문제는 디코딩 방법이 비트 맵을 필요한 크기로 축소해야한다는 것입니다. 이미지가 너무 커질 수 있습니다.

+0

문제는 Android 4.2.2에서만 발생합니다. 나는 재활용을 시도했지만 도움이되지 못했습니다. 어쩌면 이미지의 크기일까요? –

+0

@WilhelmDewald 어느 쪽이든, 확실히 비트 맵을 축소해야합니다. 앱 프로세스의 (Java) 힙 크기는 매우 제한되어 있으며 예를 들어 400x400보기로 표시하기위한 8MP 사진로드는 낭비적이고 느립니다. 다음 문서를 읽어야합니다. http://developer.android.com/training/displaying-bitmaps/index.html – tiguchi

+0

확인. 어쩌면 그것은 분명히 하나의 선택 일 것입니다. 이 옵션에 대해 살펴 보겠습니다. 고마워요 노부 –