BroadcastReceiver.onReceive는 항상 UI 스레드에서 실행됩니까?
내 앱에서 사용자 지정을 만들고 BroadcastReceiver
를 통해 수동으로 내 컨텍스트에 등록합니다 Context.registerReceiver
. AsyncTask
또한를 통해 notifier-Intents를 전달 하는 을 가지고 있습니다 Context.sendBroadcast
. 의도는 UI가 아닌 작업자 스레드에서 전송되지만 BroadcastReceiver.onReceive
(의도를받은) UI 스레드에서 항상 실행되는 것 같습니다 (나에게 좋습니다). 이것이 보장됩니까, 아니면 그것에 의존해서는 안됩니까?
BroadcastReceiver.onReceive는 항상 UI 스레드에서 실행됩니까?
예.
수신자를 동적으로 등록하므로 UI 스레드 이외의 다른 스레드가를 처리하도록 지정할 수 있습니다 onReceive()
. 이것은 registerReceiver () 의 Handler 매개 변수를 통해 수행됩니다 .
즉, 다른 핸들러를 지정하지 않으면 항상 UI 스레드에서 처리됩니다.
BroadcastReceiver.onReceive는 항상 UI 스레드에서 실행됩니까?
일반적으로 등록 방법에 따라 다릅니다.
BroadcastReceiver
사용 을 등록한 경우 :
registerReceiver(BroadcastReceiver receiver, IntentFilter filter)
메인 액티비티 스레드 (일명 UI 스레드) 에서 실행됩니다 .
다른 스레드에서BroadcastReceiver
유효한 Handler
실행을 사용하여 등록하는 경우 :
registerReceiver (BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)
그것은 당신의 맥락에서 실행됩니다 Handler
예를 들면 다음과 같습니다.
HandlerThread handlerThread = new HandlerThread("ht");
handlerThread.start();
Looper looper = handlerThread.getLooper();
Handler handler = new Handler(looper);
context.registerReceiver(receiver, filter, null, handler); // Will not run on main thread
이전 답변이 올바르게 언급 된 것처럼 onReceive
스레드에서 실행되며 그 풍미가 registerReceiver()
핸들러를 수락 하면 등록됩니다 . 그렇지 않으면 기본 스레드에서.
수신기가 등록되어있는 경우를 제외 LocalBroadcastManager
하고 방송을 통해입니다 sendBroadcastSync
- 그것은 어디 분명히 스레드에서 실행하는 호출sendBroadcastSync.
예 Context.registerReceiver (BroadcastReceiver 수신자, IntentFilter 필터, String broadcastPermission, 핸들러 스케줄러)
'programing tip' 카테고리의 다른 글
숭고한 텍스트 편집기에서 개요보기를 얻는 방법은 무엇입니까? (0) | 2020.07.28 |
---|---|
프로그램의 실행 시간을 계산하는 방법은 무엇입니까? (0) | 2020.07.28 |
OpenSSL을 사용하여 공개 키를 추출하는 방법은 무엇입니까? (0) | 2020.07.28 |
Android : ActionBar“홈”아이콘을 앱 아이콘 이외의 것으로 변경하는 방법은 무엇입니까? (0) | 2020.07.28 |
XSLT는 그만한 가치가 있습니까? (0) | 2020.07.28 |