▼Androidメモ▼
非同期処理

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);
IntentService インテントサービス UI操作不可。
フォアグラウンドでなくても殺されない。
public class MyIntentService extends IntentService {
    public MyIntentService() {
        super("MyIntentService");
    }
    @Override
    protected void onHandleIntent(Intent intent) {
        android.util.Log.e("debug","UI操作不可");
    }
}
Intent intent=new Intent(this,MyIntentService.class);
startService(intent);
<service android:name=".MyIntentService"></service>


−戻る−