2014-03-09 3 views
-1

사용자가 팝업을 요청한 후에 스크롤 가능한 팝업에 표시하기 위해 서버에서 이미지를 가져와야하는 Android 앱을 개발 중입니다. , 나는 universalImageLoader을 사용하여 모든 이미지를 얻으려고하고 Bitmaps으로 저장하고 있지만 이미지를 얻었을 때, 그리고 그 이미지를 모두 얻은 후에는 GC_FOR_ALLOC 라인을 무한하게 표시하고 pop_up을 표시하는 버튼을 누르면, POP_UP가 정상적으로 표시되지만 때 내 응용 프로그램 충돌을 아래로 스크롤하기 시작하고 난 다음 로그 메시지를 가지고 :팝업을 스크롤 할 때 내 앱이 깨집니다.

??-?? ??:??:??.???: INFO/<unknown>(<unknown>): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): [ 03-09 08:57:40.758 107: 107 I/DEBUG ] 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): Build fingerprint: 'generic/vbox86tp/vbox86tp:4.3/JLS36G/eng.buildbot.20140128.092034:userdebug/test-keys' 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): [ 03-09 08:57:40.758 107: 107 I/DEBUG ] 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): Revision: '0' 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): [ 03-09 08:57:40.758 107: 107 I/DEBUG ] 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): pid: 2269, tid: 2269, name: xample.solaceap >>> com.example.solaceap <<< 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): [ 03-09 08:57:40.758 107: 107 I/DEBUG ] 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 97808030 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): [ 03-09 08:57:40.898 107: 107 I/DEBUG ] 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>):  eax 00000000 ebx b757b6ff ecx 0000000a edx 9780803a 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): [ 03-09 08:57:40.898 107: 107 I/DEBUG ] 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>):  esi 00000008 edi 00000001 
. 
. 
. 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): channel '5284e038 com.example.solaceap/com.example.solaceap.Login (server)' ~ Consumer closed input channel or an error occurred. events=0x9 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): [ 03-09 08:57:41.014 479: 518 E/InputDispatcher ] 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): channel '5284e038 com.example.solaceap/com.example.solaceap.Login (server)' ~ Channel is unrecoverably broken and will be disposed! 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): [ 03-09 08:57:41.022 479: 518 W/InputDispatcher ] 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): channel '528b7508 PopupWindow:52a6ec40 (server)' ~ Channel is unrecoverably broken and will be disposed! 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): Grow heap (frag case) to 6.773MB for 196620-byte allocation 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): GC_FOR_ALLOC freed 7K, 27% free 6864K/9292K, paused 14ms, total 14ms 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): Attempted to unregister already unregistered input channel '5287e6f8 com.example.solaceap/com.example.solaceap.MainPage (server)' 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): Process com.example.solaceap (pid 2269) has died. 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): WIN DEATH: Window{528afe84 u0 com.example.solaceap/com.example.solaceap.Media} 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): Attempted to unregister already unregistered input channel '528afe84 com.example.solaceap/com.example.solaceap.Media (server)' 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): Force-removing child win Window{528b7508 u0 PopupWindow:52a6ec40} from container Window{528afe84 u0 com.example.solaceap/com.example.solaceap.Media} 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): Failed looking up window 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): java.lang.IllegalArgumentException: Requested window [email protected] does not exist 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>):  at com.android.server.wm.WindowManagerService.windowForClientLocked(WindowManagerService.java:7630) 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>):  at com.android.server.wm.WindowManagerService.windowForClientLocked(WindowManagerService.java:7621) 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>):  at com.android.server.wm.WindowState$DeathRecipient.binderDied(WindowState.java:1000) 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>):  at android.os.BinderProxy.sendDeathNotice(Binder.java:470) 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>):  at com.android.server.SystemServer.init1(Native Method) 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>):  at com.android.server.SystemServer.main(SystemServer.java:1066) 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>):  at java.lang.reflect.Method.invokeNative(Native Method) 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>):  at java.lang.reflect.Method.invoke(Method.java:525) 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>):  at dalvik.system.NativeStart.main(Native Method) 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): WIN DEATH: null 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): Late-enabling CheckJNI 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): Start proc com.example.solaceap for activity com.example.solaceap/.MainPage: pid=2310 uid=10050 gids={50050, 3003, 1015, 1028} 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): GC_FOR_ALLOC freed 39K, 4% free 2502K/2604K, paused 2ms, total 2ms 
??-?? ??:??:??.???: INFO/<unknown>(<unknown>): Grow heap (frag case) to 5.000MB for 2621452-byte allocation 

을 그리고 이것은 내가 이미지를 얻을 방법은 다음과 같습니다

당신이 그것을 원시 비트 맵 데이터를 작성한다면 :
ImageLoader loader = ImageLoader.getInstance(); 
public static Map<Integer, Bitmap> movies_bitmaps = new HashMap<Integer, Bitmap>(); 

loader.loadImage(url, new SimpleImageLoadingListener() { 

        @Override 
        public void onLoadingComplete(String imageUri, View view, 
          Bitmap loadedImage) { 
         try { 
          int size = loadedImage.getWidth() 
            * loadedImage.getHeight(); 
          ByteArrayOutputStream stream = new ByteArrayOutputStream(
            size); 
          Bitmap modified_image = Bitmap.createScaledBitmap(loadedImage, 180, 230, false); 
          modified_image.compress(Bitmap.CompressFormat.JPEG, 100, 
            stream); 
          movies_bitmaps.put(index, modified_image); 
          loadedImage.recycle(); 
          stream.close(); 
          modified_image = null; 
          stream = null; 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
+0

이것은 위험합니다,'catch (예외 e) {e.printStackTrace();'. 예외가 발생하는지 실제로 확인 했습니까? – Simon

+1

@Simon try/catch 블록이 위험한 이유는 무엇입니까? 귀하의 문제에 관해서는 충돌이 아주 잘 설명되어 있습니다 :'java.lang.IllegalArgumentException : 요청 된 창 [email protected]가 존재하지 않습니다 .' – Lefteris

+1

나는 try-catch가 위험하다는 것을 말하지 않았지만 물론 그렇지 않습니다. 특히 예외를 잡을 때 아무 것도 잡아 내지 않으며 아무것도하지 않는 것은 IO 예외를 효과적으로 무시하기 때문입니다. 이 스 니펫이 실행 된 후에'stream'은 어떻게됩니까? – Simon

답변

1

코드는 먼저 아무리 당신이 어떻게 보면 잘못없는 이미지의 폭과 동일한 크기 * 높이와 ByteArrayOutputStream을 만들 ... 아무것도하지 않고 대한 것입니다 크기가 4 * width * height 여야하지만 결과 크기가 이미지 너비/높이와 상관 관계가없는 압축 된 JPG를 작성하고 있습니다. 그런 다음 아무것도 닫히지 않으므로 스트림을 닫고 null로 설정합니다. 그런 다음 loadedImage.recycle()을 호출하여 loadedImage를 다시 사용할 수 없지만 나중에 사용할 명확한 의도로지도에 넣습니다. ...

loadedImage.recycle()을 제거하고 도움이되는지 확인하고 Android Bitmap.recycle()에 문서 :


코멘트에 다른 몇 가지 질문에 대답하려면 : 그 비트 맵을 클리어하면

그래서 이미지가 다음 거기 왜? 안드로이드 documenation 당

: 이것은 픽셀 데이터를 동 기적으로 해제하지 않습니다

; 다른 참조가 없으면 단순히 을 가비지 수집 할 수 있습니다.

기본적으로 recycle()을 호출하면 이후의 동작은 API와 관련하여 정의되지 않습니다. 메모리가 작동하는 경우, Andorid 4.0 이전과 Android 4.0을 포함한 post (동작)가 다르다. 왜냐하면 바이트 [] 버퍼를 기본 메모리 공간에서 VM 관리 메모리 공간으로 되돌려 놓았 기 때문이다. 여전히


GC_FOR_ALLOC 메시지.

많은 수의 대형 개체가 여전히 만들어져 있기 때문에 정상입니다. 이를 줄이려면 ByteArrayOutputStream 및 관련 코드를 제거하십시오.

관련 문제