2012-12-17 3 views
1

비트 맵 목록을 파일에 저장하려고합니다. 기본적으로, 나중에 참조 할 수 있도록 저장하여 사용자가 갤러리에서 이미지를 선택하면 앱이 닫히더라도 이미지를 유지합니다.비트 맵 ArrayList를 파일에 저장하는 방법

이것이 내가하려는 일입니다. 그러나 Exception-BufferUnderFlowException, OutOfMemoryException의 숫자가 발생합니다. 문제는 비트 맵 목록의 매우 큰 메모리 인 것 같습니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

final List<Bitmap> bitmapcontent=new ArrayList<Bitmap>(); 
    ImageView imageView; 
Gallery gallery; 

private static byte[] bytesar; 
ByteBuffer dst; 
private void savethebitmap() throws IOException, ClassNotFoundException { 

    try { 
     FileOutputStream fos = openFileOutput("bitmapimage", Context.MODE_PRIVATE); 
     ObjectOutputStream out=new ObjectOutputStream(fos); 
     out.writeInt(bitmapcontent.size()); 

     for(int i=0;i<bitmapcontent.size();i++){ 

      out.writeInt(bitmapcontent.get(i).getRowBytes()); 
      out.writeInt(bitmapcontent.get(i).getHeight()); 
      out.writeInt(bitmapcontent.get(i).getWidth()); 


      int bmSize = bitmapcontent.get(i).getRowBytes() * bitmapcontent.get(i).getHeight(); 
      if(dst==null || bmSize > dst.capacity()) 
       dst= ByteBuffer.allocate(bmSize); 

      out.writeInt(dst.capacity()); 
      dst.position(0); 

      bitmapcontent.get(i).copyPixelsToBuffer(dst); 
      if(bytesar==null || bmSize > bytesar.length) 
       bytesar=new byte[bmSize]; 

      dst.position(0); 
      dst.get(bytesar); 


      out.write(bytesar, 0, bytesar.length); 

     } 


    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

private void loadthebitmap() throws IOException,ClassNotFoundException{ 

    try { 
     freeBitmaps(); 
     FileInputStream fos = openFileInput("bitmapimage"); 
     ObjectInputStream in=new ObjectInputStream(fos); 
     int size=in.readInt(); 
     for(int i=0;i<size;i++){ 

      int height=in.readInt(); 
       int width=in.readInt(); 

       int bmSize=in.readInt(); 




       if(bytesar==null || bmSize > bytesar.length) 
        bytesar= new byte[bmSize]; 


       int offset=0; 

       while(in.available()>0){ 
        offset=offset + in.read(bytesar, offset, in.available()); 
       } 

       if(dst==null || bmSize > dst.capacity()) 
        dst= ByteBuffer.allocate(bmSize); 
       dst.position(0); 
       dst.put(bytesar); 
       dst.position(0); 
      Bitmap myVideoScreenshotBm=Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); 
       myVideoScreenshotBm.copyPixelsFromBuffer(dst); 
      bitmapcontent.add(myVideoScreenshotBm); 



     } 


    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
+0

포스트의 printStackTrace를 호출합니다. – Visruth

답변

0

arraylist가 너무 커서 heap이 처리하지 못할 수도 있습니다.

-Xmx2G -Xms1G 

-Xmx는 최대 메모리를 나타내고 -Xms는 시작할 때 할당 된 메모리를 나타냅니다. G는 GB를 나타내며 M은 MB를 나타냅니다.

위의 설명에서 G_S에 회신하면 그는 ObjectOutputStream을 사용하여 arraylist를 직렬화 한 것으로 보입니다.

편집 :

만약 당신이 덩어리처럼 조각으로 비트 맵을 깨는 시도 할 수 있습니다 많은 메모리가 나던 장치.

+0

안드로이드 장치입니다. 많은 메모리가 어디서 나올지 모르겠습니다. –

+0

예 예 죄송합니다. 코드를 준수하지 않았습니다. –

+0

@AmitD 오 죄송합니다 ... 감사합니다. –

0

out.writeObject(bitmapContent) 그리고 Bob (삼촌이어야 함) ... 기억이 부족하다면 제안을 사용하여 메모리 크기를 늘리십시오. 그리고 further tips도 있습니다. 최선을 다해 당신이 어떻게 시작하는지 알려주세요.

0

ObjectOutputStream 캐시 된 개체. 그래서 하나가 DataOutputStream 간단한 사용하거나 또한 ObjectOutputStream.reset

out.write(bytesar, 0, bytesar.length); 
    out.flush(); 
    out.reset(); 
+0

글쎄 그것은 도움이되었지만 여전히 OutOfMemoryException은 사라지지 않았다. – user1908957

관련 문제