다른 스레드의 동일한 루퍼에서 수신하는 핸들러를 구현하려고합니다.Looper.getMainLooper()로 초기화 된 핸들러가 메시지 콜백에 응답하지 않습니다.
아래에는 두 개의 핸들러가 있습니다. 하나는 메인 스레드에서 생성되고 다른 하나는 자식 스레드에서 생성되지만 둘 다 Main Looper에서 수신 대기하도록 초기화됩니다.
private Handler mMain;
public static final ThreadPoolExecutor tpe =
(ThreadPoolExecutor) Executors.newCachedThreadPool();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMain = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
Log.wtf("", "main:" + msg);
}
};
tpe.execute(new Runnable() {
private Handler tChild = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
Log.wtf("", "child:" + msg);
}
};
@Override
public void run() {
Log.wtf("", "send msg to main looper");
tChild.sendEmptyMessage(100);
}
});
}
그러나 아래와 같은 메시지를 보내면 하위 처리기 만 메시지를 인쇄합니다. 주 처리기가 메시지를받지 못합니다.
03-20 22:02:26.754: A/(12857): send msg to main looper
03-20 22:02:26.847: A/(12857): child:{ what=100 when=-8ms }
내가 뭘 잘못하고 있니? 읽어 주셔서 감사합니다.
감사합니다. 언젠가 Runnable이 내부 클래스가 아닌 외부 클래스라면, 초기화 된 핸들러를 생성자를 통해 전달해야한다고 가정 해 봅시다. 맞습니까? –
아키텍처는 애플리케이션에 따라 다르지만 메시지를 게시하려는 곳이면 어디에서나 'Handler'에 대한 참조가 필요합니다. – Devunwired
왜 응용 프로그램 컨텍스트 (응용 프로그램을 확장하는 클래스)에서 하나의 Handler (this.getMainLooper())를 사용하지 않는 것이 좋을까요? 이것은 활동에서 그것을하는 것보다 깨끗하지 않습니까? –