[Android] UIスレッド以外からのUI制御
UIスレッド以外からUI制御を行うと、例外が吐き出されてアプリが落ちてしまいます。
UIスレッド以外からUI制御を行いたい場合はHandlerを用います。
Handlerは生成したスレッドコンテキスト上にキューを生成するため、必ずUIスレッド上で生成しなければなりません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | 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(); } } |