[Android] UIスレッド以外からのUI制御
UIスレッド以外からUI制御を行うと、例外が吐き出されてアプリが落ちてしまいます。
UIスレッド以外からUI制御を行いたい場合はHandlerを用います。
Handlerは生成したスレッドコンテキスト上にキューを生成するため、必ずUIスレッド上で生成しなければなりません。
private Button btnTest = null;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//==== リスナを登録 ====//
btnTest = (Button)findViewById(R.id.btn_Test);
btnTest.setOnClickListener(testOnClickListener);
}
private View.OnClickListener testOnClickListener = new View.OnClickListener()
{
// ※必ず、UIスレッド上で生成する。
Handler handler = new Handler();
@Override
public void onClick(View v)
{
//==== スレッドを起動 ====//
Thread thread = new Thread()
{
@Override
public void run()
{
// ここでUI制御を行うと例外が出力されてしまう。
// btnTest.setEnabled(false);
handler.post(new Runnable()
{
@Override
public void run()
{
// ここでUI制御を行う。
btnTest.setEnabled(false);
}
});
}
}
thread.start();
}
}