2017-03-28 2 views
0

IntentService가 을 건너 뛰었습니다. "XX 프레임 건너 뜀! 응용 프로그램이 주 스레드에서 너무 많은 작업을 수행하고있을 수 있습니다." LogCat에 메시지가 표시되지만 이유를 모르겠습니다.Android IntentService UI 속도 저하

저는 P2P 중개자와 통신하는 앱을 만들고 있습니다. 나는 모든 통신 로직을 서비스로 옮기기로 결정했다. 처음에 나는 그 방식으로 일을했다 : 그것은 내가 모든 로직을 처리하는 작업자 스레드를 생성하지 않은 경우에도 확인을 실행

class MyService extends Service { 
    @Override 
    onCreate() { 
     // This info need to stay up as long as the context is 
     stablishEndpointAndTransport(); 
    } 

    @Override 
    onStartCommand(Intent intent, int startId) { 
     registerAccountId(intent.getIntExtra(EXTRA_ACCOUNT_ID)); 
    } 

    @Override 
    IBinder onBind(Intent intent) { 
     super.onBind(intent); 
    } 

    @Override 
    onDestroy() { 
     if (registeredAccount) deleteAccount(); 
     deleteTransportAndEndpoint(); 
    } 
} 

. 그러나 더 많은 연결 로직을 구현해야 할 필요가 있기 때문에 로직을 IntentService로 이동하기로 결정했습니다. 백그라운드 작업자 스레드의 모든 것을 처리하기 때문입니다.

은 내가 한 모두는 IntentService에 기본 클래스의 이름을 바꾸 onHandleIntent()onStartCommand() 방법의 내용을 이동, 특정 경우에 일정한 조치를 지정하고 onStartCommand()onBind() 재정의를 삭제했다.

어떻게 변경 사항이 메인 스레드의 성능에 영향을 미칩니 까?

편집

관련이 있지만, 프레임 워크에서 모두 stablishEndpointAndTransport()registerAccountId() 실행 몇 가지 방법은 비동기이다이 될 수 있습니다. 특히 브로커와 통신하는 방법은 다음과 같습니다. 그 말은, 나는 hardwork가 이미 다른 스레드에서 실행 되었기 때문에 IntentService을 포기할 수도 있습니다 (설명 : 실제로 실제로 잘 실행되는 이유는 Service). 그래도 나는 IntentService이 UI 스레드 스킵 프레임을 만드는 이유를 알지 못합니다. 당신이 IntentService는 작업자 스레드를 생성하고 서비스를 실행하는 스레드를 사용다시피

+0

이것은 IntentService가 아닙니다. IntentServices는 IntentService에서 확장됩니다. 이것은 일반적인 서비스이며 UI 스레드에서 작업을 수행합니다. –

+0

이것은'IntentService'로 바뀌었던'Service'입니다. 차이점은 코드 단편에 설명되어 있습니다. 그것은 문자 그대로입니다. –

답변

0

문제점을 발견했습니다. 주어진 비동기 호출을 감안할 때 호출이 완료되기 전에 onHandleIntent 메서드에서 복귀했습니다. 문제는 반환 일단은 ServiceHandler에 의해 구현됩니다으로 stopSelf(int)가,라고한다는 것입니다 : 내가 의도 된 작업을 수행하도록 설계되지 않았습니다

@Override 
public void handleMessage(Message msg) { 
    onHandleIntent((Intent)msg.obj); 
    stopSelf(msg.arg1); 
} 

IntentService. 내 시나리오에서는 BackgroundService으로 다시 구현하고 BackgroundService 스레드를 가능한 한 오랫동안 활성화 된 상태로 유지하기 위해 다른 수정과 함께 stopSelf()을 삭제했습니다 (see this gist).

+0

당신은 의도 서비스가 없습니다. 당신이 올린 코드가'Service'를 연장하고 있습니다. – Voski

+0

@Voski 질문의 발췌 부분 뒤의 두 번째 단락은 내가 한 일을 설명합니다. –

1

안드로이드 IntentService는 UI 스레드

방법이 둔화. 그래서 문제는 다른 곳에서해야합니다.

+0

사실, 나에게 이해가되지 않지만 설명 된 수정 사항은 문제를 유발하는 수정 사항입니다. 나는'IntentService'를 다시'Service'로 다시 작성해 보았습니다. 그리고 메시지는 사라졌습니다. (그리고 행동에 대한 권리) –