2012-06-20 3 views
-2

이것은 매우 일반적인 문제입니다. 그러나 광산은 약간 다르며 다른 주제에 대한 해결책을 찾을 수 없으므로 여기에 새로운 것을 게시합니다. ListView를 보여주는 응용 프로그램이 있습니다. ListView의 각 행은 ListAdapter를 사용하여 SD 카드에서 작은 비트 맵 아이콘을로드하는 ImageView가 있습니다 (크기가 작아서 문제가 크기와 관련이 없습니다). 이제 목록을 천천히 스크롤하면 정상적으로 작동합니다. 정말 빠르게 이동하면 ListView에 충분히 긴하지만, 그것은 더 이상 아이콘을 보여주는 아니에요과 로그 캣의 메시지는 다음과 같이이다 :안드로이드 ListView OutOfMemoryError : 비트 맵 크기가 VM 예산을 초과합니다

126 600-byte external allocation too large for this process. 
VM은 우리가 그런 다음 126,600 바이트

를 할당하지 않습니다

앱 크래시 및 logcat은 다음과 같이 나타 냈습니다.

java.lang.OutOfMemoryError: bitmap size exceeds VM budget 

두 개의 다른 장치에서 테스트 한 결과이 중 하나만이 오류를 얻었고 다른 하나는 정상적으로 작동합니다. 이 오류는 ListView가 매우 빠르게 스크롤 될 때만 발생합니다. 새 스레드가 만들어지기 때문에 가비지 수집 속도와 일치하지 않습니까? 아무도 나에게이 상황에서 제안을 할 수 있습니까?

+0

아래와 같이 실제로 몇 가지 숙제를 필요로하여 ImageLoader 클래스의 메소드를 교체해야 SDCard에 함께 작동합니다. –

+0

@Paresh Mayani : 그게 무슨 뜻이야? 나는 정말 안드로이드에 익숙하다. 그래서 좀 더 구체적으로 표현해라. – user1417127

+0

질문하기 전에, 약간의 검색을하기 전에, 이미 많은 질문이있다 : [** OutOfMemoryError : 비트 맵 크기가 VM 예산을 초과한다 **] (http :// /stackoverflow.com/search?q=OutOfMemoryError%3A+bitmap+size+exceeds+VM+budget) –

답변

0

비트 맵으로 작업하는 동안 ListView와 함께 사용하면 대부분 OutOfMemory가됩니다.

여기에 표시되는대로 LasyList으로 가야합니다.

이미지로드가 처리됩니다.

private Bitmap getBitmap(String url) 
    { 
     // If is from SD Card 
     try { 
      File file = new File(url); 
      if(file.exists()) 
      { 
       return BitmapFactory.decodeFile(url); 
      } 
     } catch (Exception e) { 

     } 

     File f=fileCache.getFile(url); 

     //from SD cache 
     Bitmap b = decodeFile(f); 
     if(b!=null) 
      return b; 

     //from web 
     try { 
      Bitmap bitmap=null; 
      URL imageUrl = new URL(url); 
      HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection(); 
      conn.setConnectTimeout(30000); 
      conn.setReadTimeout(30000); 
      conn.setInstanceFollowRedirects(true); 
      InputStream is=conn.getInputStream(); 
      OutputStream os = new FileOutputStream(f); 
      Utils.CopyStream(is, os); 
      os.close(); 
      bitmap = decodeFile(f); 
      return bitmap; 
     } catch (Exception ex){ 
      ex.printStackTrace(); 
      return null; 
     } 
    } 
+0

내 방법은 귀하의 것과 동일하며 문제가 해결되지 않았습니다. – user1417127

관련 문제