마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

아웃오브메모리(outofmemory)...아웃오브멘탈 살려주세요.

0 추천

 

안녕하세요.

정말 군대에서 얼어붙은 땅에 야삽질 하는 기분이라서..

글을 씁니다.

 

현재 한장한장 넘기는 플립뷰 스타일의 앱을 만들고 있습니다.

첫번째 엑티비티에서 3개의 뷰가 있고 각각의 뷰에 이미지뷰가 세팅되어 있습니다.

이미지뷰에 각각에 맞는 이미지파일을 웹에서 다운받아서 Bitmap으로 세팅되게 하였습니다.

그런데 총 3개의 엑티비티가 있습니다.

1번째 엑티비티는 뷰가3개이고 리스트뷰처럼 Apapter를 사용하여

한장넘길때마다 뷰가 체인지 되며 해당 뷰에 이미지를 다운받아 표시하여 줍니다.

 

두번째 세번째 엑티비티는 세부 이미지들을 다운받아서 표현해주구요..

 

근데 아웃오브메모리 문제 때문에 미치겠습니다. ㅠㅠ

 

처음 앱 실행해서 첫번째 엑티비티에서 벌써 메모리를 40메가 넘게 먹습니다.ㅠㅠ

 

그래서 몇개 보다나면 곧 다운...아웃오브메모리 ..아웃오브멘탈... ㅠㅠ

 

살려주세요.ㅠㅠ

 

최고의 위기에 직면하였습니다.

 

아래는 제가 구성해놓은 다운로드 어싱크테스크 클래스입니다.

 

어댑터에서 한장한장 넘길때마다 여기 만들어놓은 어싱크다운로드 클래스를 사용하여

다운로드 URL을 파라미터로 넘기고 이미지뷰 또한 넘겨서,

최종적으로 어싱크테스크에서 이미지 URL을 이용하여 바로 런타임으로 이미지를 다운로드하여

전달받은 이미지뷰에 세팅하고 있습니다.

 

 

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import com.aphidmobile.flip.FlipViewController;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.widget.ImageView;
import android.widget.LinearLayout;
 
public class AsyncImageDecodeStreaming<T> extends BaseAsyncTask { //제네릭<T> 사용
String imageUrl;
T imageView;
Bitmap tempBit;
Bitmap bit;
FlipViewController flipController;
int position;
 
public AsyncImageDecodeStreaming(Context context, T imageView, String ImageUrl) {
// TODO Auto-generated constructor stub
this.context = context;
this.imageUrl = ImageUrl;
this.imageView = imageView;
}
 
public AsyncImageDecodeStreaming(Context context, T imageView, String ImageUrl, FlipViewController controller, int position) {
// TODO Auto-generated constructor stub
this.context = context;
this.imageUrl = ImageUrl;
this.imageView = imageView;
this.flipController = controller;
this.position = position;
 
}
 
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
}
 
@Override
protected Integer doInBackground(Integer... params) {
// TODO Auto-generated method stub
tempBit = downloadImage(imageUrl);
return 0;
}
 
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
 
}
 
@Override
protected void onCancelled() {
// TODO Auto-generated method stub
super.onCancelled();
}
 
@SuppressWarnings("deprecation")
@Override
protected void onPostExecute(Integer result) {
// TODO Auto-generated method stub
//mProgress.dismiss();
 
if(imageView instanceof ImageView) {
((ImageView) imageView).setImageBitmap(tempBit);
flipController.refreshPage(position);
}
else if(imageView instanceof LinearLayout) {
Drawable d = new BitmapDrawable(tempBit);
((LinearLayout) imageView).setBackgroundDrawable(d);
flipController.refreshPage(position);
}
}
 
 
public Bitmap downloadImage(String url) {
bit = null;
try {
URL urlcon = new URL(url);
HttpURLConnection urlConnection = (HttpURLConnection) urlcon.openConnection();
InputStream is = urlConnection.getInputStream();
bit = BitmapFactory.decodeStream(is);
is.close();
}catch(Exception ee) { Log.i("BitmapStreamingErr", ee.toString());}
 
return bit;
}
}
 

 

 

갸아악 (21,260 포인트) 님이 2013년 4월 16일 질문

1개의 답변

+1 추천
코드를 보니 스크롤 할 때마다 무조건 bitmap 객체를 생성하는 것 같네요.

이미 생성된 bitmap을 재활용하도록 해 보세요.

우리가 눈으로 보기엔 이미지가 같아 보여도 코드를 보면 각기 다른 bitmap 을 생성하는 것 같아요.
익명사용자 님이 2013년 4월 16일 답변
...