新人成長記録12th
非同期で重たい(時間のかかる)処理をしたいことは非常に多くあります
例えば、通信中にプログレスダイアログを表示することや、重い計算や画像の処理などです
非同期処理で処理を行うには、ThreadやAsyncTaskを用います
今回はThreadについて学習していきます
また、Androidの特徴として、描画はUIスレッドで行わなければいけないため、非同期処理をしているスレッドでは、基本的に画面の描画を行うことができません
Thread
簡単な非同期処理であればTreadを利用するのがいいかと思います
単純な記述例では以下のようになります
1 2 3 4 5 6 7 8 9 |
Thread thread = new Thread(new Runnable() { @Override public void run() { //処理 } }); thread.start(); |
もちろん、以下のようにimplementでメソッドを実装することも可能です
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 |
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スレッドに描画するように指示を出すことです
1 2 3 4 5 6 7 8 9 10 11 12 |
Thread thread = new Thread(new Runnable() { @Override public void run() { handler.post(new Runnable() { @Override public void run() { textView.setText("Hello"); } }); } }); |
終わりに
非同期にしたいけど、処理の中で描画などUIスレッドでしかできないことをしていて、うまいこと処理を分けられず四苦八苦したことがあります
描画と重い処理とは基本的に、分けた方がいいのではと思います
密接な関係にあるとどうしてもユーザを待たせてしまいレスポンスの悪いアプリとなりますので
次回にAsyncTaskについて書きたいと思います
火曜日担当:poppy
admin at 2016年11月01日 03:04:03