Handler(Looper.getMainLoop()).post()
Handler(Looper.getMainLoop()).sendMessage()
Handler(Looper.getMainLooper())
Handler(Looper.myLooper())
처럼 Looper을 명확히 지정해줘야한다.
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare(); //looper 준비
mHandler = new Handler(Looper.myLooper()) {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
//stop 될때까지-외부 쓰레드에서 이 쓰레드의 looper.quit()을 해주기 전까지-
//meesage queue에 message/runnable이 있으면 hnalder에 전달하는 일을 계속해라!
}
}
Handler(Looper.getMainLooper()).sendMessage(Message.obtain())
//Int 데이터를 포함하여 Runnable 콜백이나 Any 객체 등 여러 데이터를 담아 보낼 수 있다.
//what은 수신자가 이 메시지의 내용을 식별할 수 있도록 사용자 정의 메시지 코드.
//각 핸들러에는 메시지 코드에 대한 고유한 이름 공간이 있으므로 다른 핸들러와 충돌하는 것에 대해 걱정할 필요가 없다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val mainHandler = MyHandler()
val message = mainHandler.obtainMessage(100) //메인쓰레드에 message 보내기
mainHandler.sendMessage(message)
}
inner class MyHandler : Handler(Looper.getMainLooper()) {
override fun handleMessage(msg: Message) {
//looper로 부터 message를 받은 후 어떻게 처리할지 구현
//main 쓰레드의 handler 이기 때문에 여기서 ui 변경처리를 해줘야 한다.
super.handleMessage(msg)
findViewById<TextView>(R.id.tv).text = msg.what.toString()
}
}
}