2016-08-24 2 views
4

BroadcastReceiver에서 네트워크 작업을 수행해야합니다.BroadcastReceiver에서 새 스레드를 시작하는 것이 안전합니까?

@Override 
public void onReceive(Context context, Intent intent) { 
    new Thread(new Runnable() { 
     public void run() { 
      // network stuff... 
     } 
    }).start(); 
} 

스레드가 완료되기 전에 프로세스가 살해 될 것이라는 위험이 있습니까 :

지금까지 나는 새 스레드를 시작하여 그것을 달성?

대신 IntentService을 사용하는 것이 더 좋습니까? 다른 어떤 더 나은 접근법?

답변

7

스레드가 완료되기 전에 프로세스가 종료 될 위험이 있습니까?

이 수신기가 매니페스트를 통해 등록 된 경우 예.

이 수신기가 registerReceiver()을 통해 등록 된 경우 프로세스의 수명은 다른 실행중인 구성 요소에 의해 결정됩니다.

대신 IntentService를 사용하는 것이 더 좋습니까?

그 작업이 몇 밀리 초를 초과하는 경우 IMHO, 예, 아마도 WakefulBroadcastReceiver과 함께합니다.

더 좋은 방법이 있습니까?

ANR을 트리거하기 전에 다른 스레드에서 작업 할 시간을주는 a goAsync() option on BroadcastReceiver이 있습니다. 나는 문서화가 잘되어 있지 않기 때문에 이것을 피한다. 예를 들어, 귀하의 질문을 직접적으로 다루지는 않습니다 :이 백그라운드 스레드가 작업을 수행하는 동안 프로세스의 중요성은 무엇입니까? 이렇게하면 우리의 작업이 끝나기까지 장치가 깨어있게됩니다. 등등. IntentService 또는 Service의 다른 형식을 사용하여 계약에 대해 더 잘 이해할 수 있습니다.

1

가장 좋은 생각은 아닙니다. BroadcastReceiver의 라이프 사이클은 onReceive() 호출이 끝날 때까지 지속되며, 그 후에 파괴됩니다. 새 스레드를 실행하기 시작하면 스레드가 완료되기 전에 BroadcastReceiver가 종료되어 예상치 못한 동작이 발생할 수 있습니다.

더 나은 옵션은 말한 것처럼 백그라운드 서비스를 시작하는 것입니다.

관련 문제