도움이 필요합니다. 나는 문제를 찾기 위해 여러 가지를 시도했지만, 나는 여전히 메모리 문제가있다. 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"에 대해 생각했다.
너무 많은 메모리를 사용하는 총 앱입니다. 크기가 너무 큰 비트 맵을 너무 많이로드하는 것 같습니다. 비트 맵은 얼마나 큽니까? 또한 캐싱을 구현하여 오래된 비트 맵을 유지하거나 이전의 비트 맵을 명시 적으로 재활용하지 않도록 할 수 있습니다. –
안녕하세요, 이미지의 크기는 ~ 1,3MB입니다. 그게 큰가요? 캐싱을 구현하는 방법에 대한 팁을 알려주시겠습니까? Thx –
그들 중 하나가 아니라, 그들 중 많은 수 있습니다. 캐싱에 대해서는 지원 라이브러리에있는 LRUCache를보십시오. –