2014-01-18 3 views
0

사용자가 ImageView에 물건을 그리고 그림을 저장하려면 저장을 클릭하게하십시오. 나중에 사용자는 ImageView가있는 ListView와 일부 detalis가있는 두 개의 TextView에서 저장된 모든 도면을 볼 수 있습니다.비트 맵의 ​​ListView에 메모리가 부족합니다 (해결됨)

비트 맵 저장 및 검색을 피하기 위해 txt 파일에 그려진 모든 x-y 점을 저장하고 비트 맵을 다시 생성하면서 점을 그리는 createBitmap 메서드를 사용하여 목록을 채우고 어댑터 내의 ImageView에 비트 맵을 설정합니다.

사용자가 목록을 삭제하거나 업데이트하면 파일을 다시로드하기 위해 목록 작업을 완료하고 다시 시작합니다. 모든 비트 맵은 재생성되지만 이전에는 재생 방법을 어디에서 호출해야할지 모르기 때문에 재활용되지 않습니다!

당연히 문제는 모든 비트 맵 때문에 OutOfMemory 오류가 발생한다는 것입니다. 질문 : 비트 맵 재활용을 호출 할 수있는 방법이나 다른 내가 너무 많은 메모리 이를 사용하지 않고이를 구현 할 수 있습니다 모든에 대한보기를 팽창하지 않도록

public class CustomGalleryListAdapter extends ArrayAdapter<String>{ 
private final Activity context; 
private final String[] name_plus_details; 
private final String[] imageinfo; 
public CustomGalleryListAdapter(Activity context, 
String[] name_plus_details, String[] imageinfo) { 
super(context, R.layout.gallery_list_single_item_layout, name_plus_details); 
this.context = context; 
this.name_plus_details = name_plus_details; 
this.imageinfo = imageinfo; 
} 
@Override 
public View getView(int position, View view, ViewGroup parent) { 
    Paint mPaint,mPaint2; 
    mPaint = new Paint(); 
    mPaint.setAntiAlias(true); 
    mPaint.setDither(true); 
    mPaint.setColor(Color.BLUE); 
    mPaint.setStyle(Paint.Style.STROKE); 
    mPaint.setStrokeJoin(Paint.Join.ROUND); 
    mPaint.setStrokeCap(Paint.Cap.ROUND); 
    mPaint.setStrokeWidth(23/4); 

    mPaint2 = new Paint(); 
    mPaint2.setAntiAlias(true); 
    mPaint2.setDither(true); 
    mPaint2.setColor(Color.GREEN); 
    mPaint2.setStyle(Paint.Style.STROKE); 
    mPaint2.setStrokeJoin(Paint.Join.ROUND); 
    mPaint2.setStrokeCap(Paint.Cap.ROUND); 
    mPaint2.setStrokeWidth(17/4); 


    LayoutInflater inflater = context.getLayoutInflater(); 
    Bitmap mBitmap = Bitmap.createBitmap(600/5, 700/5, Bitmap.Config.ARGB_8888); 
    Canvas mCanvas = new Canvas(mBitmap); 
    String[] imagedata = imageinfo[position].split(":"); 
    String[] points; 
    for(int i=0;i<imagedata.length;i++){ 
     if(imagedata[i].contains(";")){ 
      points=imagedata[i].split(";"); 
      if(points[0].length()>0){ 
       int drawx1 = Integer.parseInt(points[0].split(",")[0]); 
       int drawy1 = Integer.parseInt(points[0].split(",")[1]); 
       mCanvas.drawCircle(drawx1/5, drawy1/5, 15/4, mPaint2); 
      } 
      for(int h=0;h+1<points.length-1;h++){ 
       int drawx1 = Integer.parseInt(points[h].split(",")[0]); 
       int drawy1 = Integer.parseInt(points[h].split(",")[1]); 
       int drawx2 = Integer.parseInt(points[h+1].split(",")[0]); 
       int drawy2 = Integer.parseInt(points[h+1].split(",")[1]); 
       mCanvas.drawLine(drawx1/5, drawy1/5, drawx2/5, drawy2/5, mPaint); 
      } 
     } 
    } 
    View rowView= inflater.inflate(R.layout.gallery_list_single_item_layout, null, true); 
    TextView detailsTextView = (TextView) rowView.findViewById(R.id.txt); 
    TextView name_field = (TextView) rowView.findViewById(R.id.gallery_name_field); 

    ImageView imageView = (ImageView) rowView.findViewById(R.id.img); 
    imageView.setImageDrawable(new BitmapDrawable(getContext().getResources(),mBitmap)); 
    imageView.setScaleType(ImageView.ScaleType.FIT_XY);  
    imageView.setBackgroundColor(Color.GRAY); 
    String[] text_parts = name_plus_details[position].split("ENDNAME"); 
    name_field.setText(text_parts[0]); 
    detailsTextView.setText("\n"+text_parts[1]); 

    return rowView; 

} 
} 
+0

에 한번 당신의 행 레이아웃을 재사용 : 또한 비트 맵을 처리 할 수있는 매우 편리한 방법을 당신을 줄 것이다이 솔루션을 사용

. getView 호출을 모두 부 풀리지 마십시오. getView에서 구현시 메모리 오류가 발생하는 것은 매우 정상입니다. – Devrim

+0

나는 사과한다. 그러나 나는 그것을 알아 듣지 않았다.. 당신은 조금 더 설명 할 수 있냐? "행 레이아웃 재사용"을 사용하면 현재 화면에없는 목록 항목을 무료로 사용할 수 있습니까? – Anonymous

답변

0

홀더를 사용해보십시오 목록 어댑터입니다 셀을 재사용하고 있기 때문에 이 체크 아웃 : http://developer.android.com/training/improving-layouts/smooth-scrolling.html#ViewHolder 방법

+0

나는 안드로이드에서 초보자이기 때문에 할 일이있는 것 같아. 나는 그것을 조사 할 것이지만 제발 ... 어떤 식으로 당신의 접근 방식이 기억을 저장할 것인가? 나는 전체 목록에 대한 비트 맵을 만들어야 만하므로 어떤 변화가 있습니까? – Anonymous

+0

홀더를 사용하면 기억력이 크게 좋아질 것입니다. 그냥 내게 알려주는 것을 시험해 보라 – alecnash

+0

나는 의견을 달리하지 않는다. .. 나는 단지 개념을 더 잘 이해하고 싶다. (비트 맵으로 비트 맵이 저장되어 있지 않다는 것을 눈치 채지 못했을 때) 프로그래밍 방식으로 다시 만들었습니다. – Anonymous

0

먼저 ArrayAdapter와의 홀더를 사용하는 방법을 알려주는 웹에있는 예제의 톤도있다 -이 읽기 : http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

나는 당신이 훨씬 절약 할 수 있다는 생각은 메모리는 내가 아는 한 당신의 비트 맵을위한 아틀라스와 같은 것을 만들었다는 것을 이해합니다 - 이것은 훨씬 좋아 보입니다. 이 http://developer.android.com/reference/android/util/LruCache.html#entryRemoved(boolean, K, V는, V)

관련 문제