Thread中からビューを操作する方法

重い処理をするときはスレッドなどを使って別に処理しますが、そのときそのスレッド内でビューにアクセスしようとするとエラーが起きてしまいます。

それにはUIスレッドというものが関係しています。

UIスレッドの意味

UIスレッドとはAndroidにおいてボタンやテキストビューなどのユーザーインターフェイス(UI)の処理を行っているメインスレッドのことです。

このスレッドがあるのでビューの表示を行いながら裏では別スレッドで重い処理を行うことが可能になります。

別スレッドからUIスレッドへのアクセス方法

では、どうやってUIスレッド以外のスレッドからビューにアクセスするかというとHandlerクラスを利用します。

例えば重い処理の始まりと終わりの間にプログレスダイアログを表示するような例を作ってみます。

その場合は次のようなコードが書けます。

public class MainActivity extends Activity 
{
    private ProgressDialog progressDialog;
    private Handler handler;
    private Thread thread;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        progressDialog = new ProgressDialog(this);
        progressDialog.setMessage("処理中...");
        progressDialog.show();
        
        handler = new Handler();
            //UIスレッドにアクセスするためのハンドラー
        thread = new Thread(new Runnable()
        {
            
            //ループやファイル読み込みなどの重い処理(ここでは5秒間の中断)
            Thread.sleep(5000);
            
            handler.post(new Runnable()
            {
                @Override
                public void run() 
                {
                    progressDialog.dismiss();
                }
            });
        }).start();
    }
    
    public void onParse()
    {
        super.onParse();
        handler = null;
            //ハンドラーを終了する。
    }
}

この例ではスレッド内で5秒間処理を止めて重い処理を再現しています。この処理の間はずっと次のようなプログレスダイアログを表示し続けるようにしています。

プログレスダイアログの表示例

重い処理が終わったらHandlerクラスのpostメソッドに新しいRunnableインスタンスを渡し、その中でテキストビューやボタンなどのUIにアクセスできます。

この例ではプログレスダイアログを閉じています。

関連項目
プライバシーポリシー