新人成長記録12th

非同期で重たい(時間のかかる)処理をしたいことは非常に多くあります
例えば、通信中にプログレスダイアログを表示することや、重い計算や画像の処理などです

非同期処理で処理を行うには、ThreadやAsyncTaskを用います
今回はThreadについて学習していきます

また、Androidの特徴として、描画はUIスレッドで行わなければいけないため、非同期処理をしているスレッドでは、基本的に画面の描画を行うことができません

Thread

簡単な非同期処理であればTreadを利用するのがいいかと思います

単純な記述例では以下のようになります

Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                //処理
            }
        });
        
        thread.start();

もちろん、以下のようにimplementでメソッドを実装することも可能です

public class MainActivity extends Activity implements Runnable{
    public void onCreate(Bundle bundle){
        super.onCreate(bundle);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.mainactivity);
        this.bundle = new Bundle();
        this.bundle.putBoolean("END",false);

        handler = new Handler();

        b1 = (Button) findViewById(R.id.frag1);
        b1.setOnClickListener(this);
        b2 = (Button) findViewById(R.id.frag2);
        b2.setOnClickListener(this);

        gv = new GraphicsView(this);

        Thread thread = new Thread(this);

        thread.start();

    }

    public void run(){
        //処理
    }
}

しかし、どの処理でも非同期スレッドの中では、UIスレッドの描画は行うことはできません
非同期処理の中で描画をしたいのならば、以下のようにHandlerでUIスレッドに描画するように指示を出すことです

Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        textView.setText("Hello");
                    }
                });
            }
        });

終わりに

非同期にしたいけど、処理の中で描画などUIスレッドでしかできないことをしていて、うまいこと処理を分けられず四苦八苦したことがあります
描画と重い処理とは基本的に、分けた方がいいのではと思います
密接な関係にあるとどうしてもユーザを待たせてしまいレスポンスの悪いアプリとなりますので

次回にAsyncTaskについて書きたいと思います

火曜日担当:poppy



アプリ関連ニュース

お問い合わせはこちら

お問い合わせ・ご相談はお電話、またはお問い合わせフォームよりお受け付けいたしております。

tel. 06-6454-8833(平日 10:00~17:00)

お問い合わせフォーム