2012-10-28 3 views
0

문제가

안녕,사용자 정의 이미지보기 아래

나는 사용자가 일부 사진을 지정하고 그들이 screen.So에있을거야 얼마나 때때로 그가에 원하는 응용 프로그램을 개발하고 있어요 속도가 느려집니다 작은 애니메이션과 같은 것을 만들거나 약간의 시간 동안 이미지를 보는 것입니다. 문제는 이미지가 미리보고되지 않아서 약간의 시간이 지나면 오류가 발생한다는 것입니다. 어플리케이션에서 시간을 개발하고 있습니다. 문제가 있으므로 문제가 무엇인지에 대해 도움을 드리고 싶습니다.

는 그래서 mathod의 ImageOperations 그런 어디는 HashMap의

Bitmap image = ImageOperations(url,String.valueOf(frameNum) + ".jpg"); 

ImageMap.put(String.valueOf(frameNum), image); 

에 저장 내가 내 웹 응용 프로그램에서 사진을 찍을을 남기고 방법을 설명하자 다음 코드 :

private Bitmap ImageOperations(String url, String saveFilename) { 
     try { 
      Display display = getWindowManager().getDefaultDisplay(); 
      InputStream is = (InputStream) this.fetch(url); 
      Bitmap theImage = BitmapFactory.decodeStream(is); 
      if (theImage.getHeight() >= 700 || theImage.getWidth() >= 700) { 
       theImage = Bitmap.createScaledBitmap(theImage, 
         display.getWidth(), display.getHeight() - 140, true); 
      } 
      return theImage; 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
      return null; 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return null; 
     } 

    } 

나중에 사용자 지정시 UI를 업데이트하는 스레드를 실행합니다. 업데이트하는 방법은이 방법입니다. 우리는 우리가 잠에 대한 스레드를 넣어 이미지를 업데이트 할 때이 문제를 만들고 뭔가를 thread.Is를 업데이트를 다시 실행 한 후

public void setPictures(int NumOfFrame) { 
if (frameArray.get(NumOfFrame - 1).frame_pic.contains("n/a") != true) { 
ImagePlace.setImageBitmap(ImageMap.get(String.valueOf(NumOfFrame))); 
} else { 
     ImagePlace.setImageDrawable(null); 
} 

} 

? 그것은 가비지 컬렉션을 수행해야합니까?

ImageMap.get(String.valueOf(NumOfFrame)) 

그리고 여기에 기존 비트 맵을 재활용하지 않는 :

+0

ImageMap에 몇 개의 이미지가 있습니까? – sandrstar

+0

그림의 번호는 5-30입니다. 애니메이션의 경우 대부분의 사진이 반복됩니다. 사용자가 내가 1,2,3,4,1,2,3,4,1,2,3,4 시퀀스와 함께 볼 수있는 그림을 원한다고 말하면 앱은 UI에 표시합니다. –

답변

0

먼저 당신이 여기 널 체크를 누락 미리 감사

theImage.recycle(); // missing line 
theImage = Bitmap.createScaledBitmap(theImage, 
         display.getWidth(), display.getHeight() - 140, true); 

그것은 될 수 있습니다 outofmemory 예외에, 문제의 설명에서 가능성이 높습니다.

또한 그가 실패 할 때 BitmapFactory.decodeStream 예외를 throw하는지 확실하지 않습니다. 거기에 널 포인트 체크를 추가해야합니다.

+0

null을하고 있습니다. outOFmemory 예외로 이어지는 문제는 없습니다. 해시 맵에서 내 비트 맵을 모두 얻습니다. –

+0

@vlad_o 스케일링을 수행하면 이전 비트 맵을 파괴하지 않고 새 비트 맵을 생성 할 수 있습니다. –

+0

@Balibu Thanx.I 재활용을 추가했지만 문제가 여전히 남아 있습니다. 힙 사용량을 줄여야 할 수도 있습니다./ –

1

아마도 문제는 추가 이미지를로드 할 때 힙 크기가 증가한다는 것입니다. 나는 당신이 약간 profiling을 할 것을 제안 할 것이고 그래서 일들은 훨씬 더 분명해질 것이며 당신은 그 어플리케이션을위한 타이밍의 전체 그림을 얻을 것이다.

+0

모든 타이밍 로그를 내 서버의 텍스트 파일로 가져온 다음 matlab을 사용하여 모든 분석을 수행합니다. 문제가 힙 크기 인 경우 무엇을 할 수 있습니까? –

+0

사용량을 줄이기 위해 노력하십시오.이미지로드를 시작하기 전에 일부 힙 크기를 미리 할당하거나 이미지를 덜 저장할 수 있습니다 (평균, 캐시 폴더에 크기가 변경된 사본을 저장하고 현재지도에 고정 된 수의 이미지 만있는 경우 LruCache가 유용 할 수 있습니다) – sandrstar

+0

So 즉, 내 hashmap 유지해야하지만 LruCache.So LarCache있는 특정 비트 맵을 거기에 보관됩니다 그렇지 않으면로드 할 경우 이미지를로드 할 싶습니다 가장 많이 나타나는 이미지를 넣어 의미합니다 Hashmap 캐시에 추가 하시겠습니까? –