다음과 같은 방법을 사용하세요.
public void Test() {
new Thread(new Runnable() {
@Override
public void run() {
Handler cHandler = new Handler(Looper.getMainLooper()) {
@Override public void handleMessage(Message msg) {
// 이제 오류 안 뜸.
Toast.makeText(MainActivity.this,
"오류 안 뜸",
Toast.LENGTH_LONG).show();
}
};
cHandler.sendEmptyMessage(0);
}
}).start();
}
또는
public void Test() {
new Thread(new Runnable() {
@Override
public void run() {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,
"Hello World!!",
Toast.LENGTH_LONG).show();
}
});
}
}).start();
}
기본 생성자를 통하여 Handler 를 생성하면 내부적으로 Looper.myLooper() 를 호출하여 생성된 Handler 가 사용할 Looper 를 가져옵니다. 하지만 질문에 들어있는 코드에서 생성된 쓰레드는 Looper 를 사용하지 않습니다. 그렇기 때문에 오류가 나는 것 입니다.
즉 Looper 를 사용하지 않는 쓰레드에서 Handler 의 기본 생성자를 이용하여 생성할 때, 내부에서 Looper.myLooper() 메소드를 이용하여 현재 쓰레드와 관련된 루퍼를 가져옵니다. 하지만 질문자님께서 생성한 쓰레드는 Looper를 사용하는 쓰레드가 아니며, 결국 myLooper() 가 null 을 리턴하기 때문에 에러가 나는 것 입니다.
하지만 Looper.getMainLooper() 메소드를 호출하여 반환된 값을 인자값으로 넣어주면 에러가 발생하지 않습니다.
Looper.getMainThread() 를 통하여 가져온 Looper는 앱의 메인 쓰레드와 관련된 Looper 입니다.
루퍼에 대한 설명 : http://developer.android.com/reference/android/os/Looper.html