2012-11-30 6 views
4

AsyncTask를 통해로드 된 이미지의 작은 축소판이있는 scrollview가 있으며 image URL에 이미지 URL을 던집니다.메모리 부족 imageViews

동적으로 추가 된 다음 위에 클릭 한 축소판의 이미지를 보유하는 기본 imageView입니다. 당신은 미리 약 10 + 이미지 ...

나는 그래서 그들은 엄지 손가락에서 이미지를 클릭하면 미리보기와 같은 방법을 통해 mainImage URL을로드하고, 그것을로드있을 때까지

모든 위대한 실행 그것 위로.

나는 방법 자체에 비트 맵을 재활용하고 있지만, 10 개 이상의 이미지 (썸네일 확인로드,하지만 난 클릭 충돌 메인 이미지를로드)

를로드 할 때 메모리 부족과 충돌 할 것으로 보인다

도움이

감사이 내가 부하 이미지 (썸네일 + 주) 사용하고있는 코드입니다 : 당신은 아마 비트 맵 캐시 전략의 일종으로 일해야

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { 
     ImageView bmImage; 

     public DownloadImageTask(ImageView bmImage) { 
      this.bmImage = bmImage; 
     } 

    protected Bitmap doInBackground(String... urls) { 
     String urldisplay = urls[0]; 
     Bitmap mIcon11 = null; 
     try { 
     InputStream in = new java.net.URL(urldisplay).openStream(); 
     mIcon11 = BitmapFactory.decodeStream(in); 
     } catch (Exception e) { 
      Log.e("Error", e.getMessage()); 
      e.printStackTrace(); 
     } 
     return mIcon11; 
    } 

    protected void onPostExecute(Bitmap result) { 
     bmImage.setImageBitmap(result); 
    } 
    } 

답변

0

가하는 데 시도 도서관 둘러보기 Universal Image Loader, 필요한 작업에 매우 효과적입니다.

리사이클링 비트 맵은 더 이상 사용되지 않을 것이라는 확신이있을 때만 수행해야합니다. 폭 = widt * 1.5 :

1

단지는 요소 1.5 예 등으로 (더 작은 크기로 비트 맵의 ​​크기를 조정 4 회

public static Bitmap getImage(byte[] image) { 
     BitmapFactory.Options config = new BitmapFactory.Options(); 
     config.inPreferredConfig = Bitmap.Config.RGB_565; 
     config.inSampleSize = 4; 
     return BitmapFactory.decodeByteArray(image, 0, image.length,config); 

    } 
0

시도에 의해 하시다면 이미지를 축소합니다 ... 통해 UR 이미지에이를 구현) 다음 strech (귀하의 view.it에 맞는 xy 또는 무엇이든) 당신이 결정 요인으로 인해 이미지의 품질이 저하됩니다. 그것은 더러운 방법입니다. 또한 Niun Goia와 같은 비트 맵 rgb가 잘 작동한다고 언급합니다.

1

Android 공식 튜토리얼 2 개를 읽어야합니다. 그들은 얼마나 효율적으로 큰 비트 맵을로드하는 방법을 가르 칠 것입니다, 그들은 우리의 생산 응용

Displaying Bitmaps Efficiently

Loading Large Bitmaps Efficiently

+0

이미지는 매우 작습니다 (크기는 50-60kb 이내입니다). 나는 같은 크기를보고 있는지 확인하고 대신 불합리한 양의 메모리를 사용하지 않습니다. – sykal

1

당신이 입력 스트림을 종료하지 않는에서 우리가 사용하는 작업 코드 샘플을 제공합니다. 그래서 항상 이미지 URL이 비싸고 생성 된 입력 스트림 객체를 실행하여 OutofMemoryError를 발생시킬 때. catch 블록 다음에 코드를 추가하십시오.

in.close(); 
in = null; 
+0

열려있는 모든 것을 닫는 것이 좋지만 스트림은 데이터를 메모리에 보관하지 않습니다. 그들은 입력에서 출력으로 데이터를 전달합니다. 'try' 이후 'in'이 범위를 벗어나기 때문에 여기에 쓰레기 수집됩니다. – zapl

0

이 경우 ScrollView를 사용하면 안됩니다. ListView를 사용해야합니다. ScrollView (LinearLayout 또는 그 안에있는 것과 같은 내용)를 사용하면 목록의 모든 요소가 아무리 큰 경우에도 즉시로드하려고 시도합니다. ListView를 대신 사용해보십시오. 정확한 이유는 표시되는 행의 UI 요소 만 메모리에로드하기 때문입니다.

+0

그래도 사용자가 미리보기 이미지를 가로 질러 스크롤 할 수있게 해주기 때문에 스크롤 뷰에 이미지를 유지하고 싶습니다. – sykal

+0

이 일을 scrollview 함께 설정되어, 어떻게 든 자신의 행을 캐싱을 구현해야합니다. 내 뜻을 잘 설명하려면 [여기]를 클릭하십시오 (http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/). 자신 만의 목록보기를 만드는 방법에 대한 아주 좋은 가이드가 있습니다 [here] (http://developer.sonymobile.com/2010/05/20/android-tutorial-making-your-own-3d-list-part-1/) 및 [여기] (http://developer.sonymobile.com/2010/05/31/android-tutorial-making-your-own-3d-list-part-2/). –

0

당신은 안드로이드를 사용할 수 있습니다 largeHeap는 = "true"로 더 큰 힙 크기 내가 이것을 사용

answer