先日のGoogleDeveloperDays2010JapanでAndroidの高速化の際に出てきてたクラス。
気になってググったらやっぱり日本語の説明があんまりないのでメモ的に簡単に説明。
ServiceをオーバーライドしたIntentService
任意の特定の処理をメインスレッドとは別のスレッドで非同期で行うためのクラス。
このサービスは通常メインスレッドでハンドリングしないような処理を行うためのものらしい。
呼び出し方はサービス的だけれども同一プロセス内で別スレッドを立ち上げて処理する。
実際に実装するには、IntentServieを拡張しonHandleIntent内に特定の処理を記述する。
IntentService拡張
サービスとしてのクラスなのでインナークラスでの記述は不可能
public class CustomIntentService extends IntentService{ private static final String name="TEST"; public CustomIntentService() { super(name); } @Override protected void onHandleIntent(Intent intent) { //ここに時間のかかる重い処理を記述 } }
Activity側での呼び出し
@Override public void onResume(){ super.onResume(); Intent intent = new Intent(Intent.ACTION_SYNC,null,this,CustomIntentService.class); this.startService(intent); //ここからスタート! }
ちゃんとAndroidManifest.xmlにも記述
<application android:icon="@drawable/icon" android:label="@string/app_name"> ・ ・ ・ <service android:name="CustomIntentService"></service> //先ほどの拡張クラスを明記! </application>
そんなIntentServiceの中身
中身はHandlerThreadを1つ作ってそのループにキューを投げるというだけっぽいので、
たとえば同時に複数回startServiceメソッドを呼び出したとしてもここで要求される全てのリクエストは、
サービスを開始した順に同一プロセス内でシングルスレットで一つずつ処理される。
すべてのキューが終了したら通常のスレッドと同じように破棄される、という流れなのかな。
とはいえ、AsyncTaskと違うのはIntentServiceはService自身をスタートさせたActivityに依存せずに処理が続く。
AsyncTaskのように元Activityの生き死にで処理の中断などはされない。
0 件のコメント:
コメントを投稿