UI操作(textView.setText("hoge")など)が可能なのはメインスレッドのみ。
UI操作する時はHandlerやMessageを使い、UI操作とは別に裏で処理を行いたい時はThreadやTimerを使う。
非同期処理
クラス | スレッド種別 | 用途 | サンプル |
Handler | メインスレッド | UI操作 | Handler handler=new Handler(); handler.postDelayed(new Runnable(){ public void run() { android.util.Log.e("","UI操作可能"); } },100); |
Message | メインスレッド | UI操作。 | Handler handler=new Handler(); Message msg=Message.obtain(handler,new Runnable() { public void run() { android.util.Log.e("","UI操作可能"); } }); msg.what=MESSAGE_ID;//メッセージID msg.obj=object; //任意のオブジェクト引数 msg.arg1=0; //任意のint引数 msg.arg2=0; //任意のint引数 handler.sendMessageDelayed(msg,100); |
handler.removeMessages(MESSAGE_ID); | |||
Thread | 独自スレッド | UI操作不可。 | Thread thread=new Thread(){ public void run() { android.util.Log.e("","UI操作不可"); } }; thread.start(); |
Timer | 独自スレッド | UI操作不可。 | Timer timer=new Timer(); TimerTask task=new TimerTask() { public void run() { android.util.Log.e("","UI操作不可"); } }; timer.schedule(task,0,100); |
AsyncTask | メインスレッド+ | メインスレッドと独自スレッドが共存 | public class DownloadTask extends AsyncTask<T1, T2, T3> { @Override protected T3 doInBackground(T1... args) { android.util.Log.e("","UI操作不可"); } @Override protected void onPostExecute(T3 result) { android.util.Log.e("","UI操作可能"); } } |
new DownloadTask().execute(args); |
0 件のコメント:
コメントを投稿