2011-02-23 4 views
2

주기적으로 알림 진행 상황을보고하는 다운로드 작업이 있습니다. 잠시 동안 한 번씩 RemoveView 개인 멤버를 사용하여 업데이트했습니다. 예를 들어누군가가 RemoteViews GC 동작을 설명 할 수 있습니까?

:

private RemoteViews mRemoteView; 
protected void onCreate(){ 
    mRemoteView = new RemoteViews(getPackageName(), R.layout.custom_layout) 
    contentView.setImageViewResource(R.id.notification_icon, R.drawable.downloads); 
    contentView.setTextViewText(R.id.notification_text, "Downloading A File " + (int)((double)progress/(double)max * 100) + "%"); 
    contentView.setProgressBar(R.id.mProgress, max, progress, false); 

    notification.contentView = contentView; 
    mNotificationManager.notify(HELLO_ID, notification); 
} 

protected void onProgressUpdate(Integer... prog) { 
    contentView.setProgressBar(R.id.mProgress, max, progress, false); 
    mNotificationManager.notify(HELLO_ID, notification); 
} 

그러나, 나는 GC가 지속적으로 공간을 취소하고 오랜 시간 동안 크롤 링을 아래로 그 응용 프로그램을 둔화 된 것으로 나타났다. 나는 내가 업데이트 할 때마다 새로운 RemoteView를 생성하려고 노력했다. 왜 이런지 궁금하네요. 나는 종류의 도움이되었다 here를 찾아 냈다, 그러나 나는 정보 더를 찾고있다.

protected void onProgressUpdate(Integer... prog) { 
     RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.custom_notification_layout); 
     contentView.setImageViewResource(R.id.notification_icon, R.drawable.downloads); 
     contentView.setTextViewText(R.id.notification_text, "Downloading A File " + (int)((double)progress/(double)max * 100) + "%"); 
     contentView.setProgressBar(R.id.mProgress, max, progress, false); 

     notification.contentView = contentView; 
     mNotificationManager.notify(HELLO_ID, notification); 
    } 

답변

4

제공 한 링크를 설명합니다 :

리모트 뷰 RemoteViews는 원격 프로세스에서보기를 만드는 데 사용되는

여기에 작동하는 코드입니다. 실제로 그것은보기는 아니지만 대기열에 들어간 일련의 명령입니다. 그런 다음이 대기열이 직렬화되고 원격 프로세스로 보내지고 직렬화 해제 된 다음이 일련의 작업이 실행됩니다. 결과는 원격 프로세스에서 완전히 빌드 된 뷰입니다.

링크가 설명합니다 : RemoteViews에서 메소드를 호출 할 때마다 액션이 큐에 추가됩니다. 불행히도 대기열을 지우는 방법은 없으므로 OOM 예외가 발생할 때까지 계속 증가합니다.

이제 큐는 모든 컬렉션과 마찬가지로 배열로 내부적으로 지원됩니다. 대기열이 내부 배열로 채워지면 더 큰 새 배열을 만들고 모든 이전 데이터를 복사해야합니다. 그런 다음 GC는 이전 배열을 지 웁니다. RemoteViews 내부 대기열이 지속적으로 증가하고 있기 때문에 새로운 배열이 만들어지고 GC는 항상 오래된 배열을 삭제합니다.

+0

답해 주셔서 감사합니다. 시간이 지나도 대기열이 제거 되나요? 그래서 내 onProgressUpdate()가 1 시간마다 호출되면 (그냥 긴 예제 사용) 문제가 없어야합니다. 내 예제에서는 매우 자주 업데이트되어 큐가 문제가되는 이유를 알 수 있습니다. – Pzanno

+0

예, 사용 속도가 느리면 문제가 덜 심각합니다. GC가 작업에 대처할 수 있습니다. 그러나 이것은 RemoteViews 내의 큐가 지워진다는 사실을 바꾸지 않습니다. RemoteView는 뷰를 빌드하기위한 일련의 명령입니다. 원격 측에서보기를 작성하는 것보다 명령을 계속 추가하는 경우 시간이 오래 걸립니다. –

관련 문제