Android

[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();
    }
}

 
 

-Android
-

S