2011年10月13日木曜日

非同期処理

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 件のコメント:

コメントを投稿