2017-09-05 6 views
-6

나는 안드로이드 프로그래밍에 익숙하지 않습니다. 비트 맵을로드 할 때 문제가 있습니다.로드해야하는 비트 맵이 거의 92 개 있습니다. 하지만, 9 또는 10 비트 맵 후 응용 프로그램이 충돌은 .. 친절하게 여기 arraylist에서 거대한 양의 비트 맵을로드 할 때 내 응용 프로그램이 다운 됨

이 09-05 19시 49분 "OOM까지 1,805,056 무료 바이트 1천7백62킬로바이트으로 22,050,012 바이트 할당을 할당 할 수 없습니다"라는 오류 OutOfMemoryError를 던지고 도와 : 36.188 2615년부터 2615년까지/com.example.zeeshanahmedawan.yourworriestheirsolutions D/라이브러리에 의존 : --- 할당이 축소 비트 맵

mPages = new ArrayList<Bitmap>(); 
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p1)); 
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p2)); 
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p3)); 
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p4)); 
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p5)); 
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p6)); 
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p7)); 
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p8)); 
    mPages.add(BitmapFactory.decodeResource(getResources(), R.drawable.p9)); 
+0

) LogCat을 사용하여 충돌과 관련된 Java 스택 추적을 검사하십시오. https://stackoverflow.com/questions/23353173/unfortunately-myapp-has-stopped-how-can - 해결 -이. – CommonsWare

+0

Throwing OutOfMemoryError "OOM까지 1805056 프리 바이트 및 1762KB의 22050012 바이트 할당을 할당하지 못했습니다" 09-05 19 : 49 : 36.188 2615-2615/com.example.zeeshanahmedawan.yourworriestheirsolutions D/skia : --- 할당에 실패했습니다. 크기가 조정 된 비트 맵 @CommonsWare –

+1

나는 잘못된 방향으로 가고 있다고 말하고 싶습니다. 팽창 된 비트 맵을 배열에 저장하면 불필요하게 많은 양의 메모리를 사용하게됩니다. 리소스 ID의 배열이나 목록을 유지하는 것만으로는 안됩니다. 즉 RecyclerView의 어댑터에 필요할 때 팽창됩니다. –

답변

2

모든 이미지의 크기가 비슷한 경우 ~ 2028601104 바이트 = ~ 1981055KB = ~ 1934MB를 할당하려고합니다. 앱에서 사용할 수있는 대부분의 Android 기기에 64MB 이하의 용량이 있습니다.

디코딩하고 크기를 조정했을 때 실패한 이미지의 크기는 22050012 바이트입니다. 이는 2347 x 2347 픽셀에 해당합니다. Android 기기에 해당 해상도의 화면이있는 경우는 거의 없습니다.

그래서, 당신은 몇 가지 작업을 수행해야합니다

  1. 정지 앞까지 비트 맵을 모두로드하려고합니다. 필요에 따라로드하십시오.

  2. 비트 맵의 ​​해상도를 줄입니다.

  3. res/drawable-nodpi/ 이외의 다른 디렉토리에 비트 맵을 넣는 경우 비트 맵을 res/drawable-nodpi/으로 옮깁니다. 예를 들어 이미지를 res/drawable/에 넣으면 res/drawable-mdpi/의 동의어이며 해당 이미지가 mdpi 개의 장치 (~ 160dpi) 용으로 설계되었음을 나타냅니다. 안드로이드는 고밀도 기기를 위해 이미지를 자동으로 확대합니다. 크기가 큰 이미지가있는 경우 Android에서 그런 종류의 크기 조정을 할 여유가 없습니다. res/drawable-nodpi/은 Android에 이러한 이미지가 특정 밀도로 묶여 있지 않으므로 이런 식으로 크기를 조정해서는 안됩니다.

이 전체 계획을 다시 고려할 수도 있습니다. 많은 비트 맵 작업 — 큰 문제는 —뿐 아니라 경험 많은 Android 앱 개발자도 복잡합니다. 메모리 관리가 어렵습니다. Android를 처음 사용하는 사람이라면 구현하기가 더 쉬운 프로젝트를 고려해야합니다.

+0

감사 문제가 해결되었습니다. –

0

당신은 메모리가 부족하다 실패했습니다.

비트 맵이 너무 커서 배열에 저장할 수 없습니다.

+1

이 경우 에뮬레이터의 메모리 양은 의미가 없습니다. OP가 ~ 2GB를 할당하려고 시도하고 있으며, 프로세스 당 힙 제한이 이보다 훨씬 적습니다. – CommonsWare

+0

그리고 그들 중 92 명이 있습니다. 나는 사지에 나가서 비슷한 크기로 맞춰 졌다고 추측한다. – CommonsWare

0
  1. 사진을 보는 데 필요한 경우 RecyclerView를 사용할 수 있습니다. 그것은 현재 화면에있는 일부 사진 만 메모리에 유지하고 화면 밖으로 스크롤 된 사진을 해제합니다.

  2. 다른 목적으로 모든 사진을 SD 카드에 저장할 수 있습니다. 두 경우 모두 1 개 &이 사용하는 특별한 라이브러리 (글라이드, 피카소, ...)에 대한

. 라이브러리는 사용하기 쉽고 SD 카드에 다운로드 한 이미지를 자동으로 캐시 할 수 있으며 다른 많은 이점을 제공합니다."recyclerview와 함께 활주"검색 (예 :