私の Android アプリケーションには、ListActivity があります。この ListActivity は、サービスの項目を入力する SimpleAdapter を使用します。したがって、私のコードでは、次のようにします。
MySuperCoolService.Binder serviceBinder = null;
private ServiceConnection serviceConnection = new ServiceConnection()
{
public void onServiceConnected(ComponentName className, IBinder service) {
Log.d(TAG, "Service connection: connected!");
serviceBinder = (MySuperCoolService.Binder)service;
}
public void onServiceDisconnected(ComponentName className) {
Log.d(TAG, "Service connection: disconnected");
serviceBinder = null;
}
};
bindService(new Intent(this, MySuperCoolService.class), serviceConnection, BIND_AUTO_CREATE);
while(serviceBinder==null) {
Thread.Sleep(1000);
}
// now retrieve from service using binder and set list adapter
この操作全体にかかる時間はほとんどない (1 秒未満) ため、UI スレッドで実行したいと考えています。私のonCreateを参照してください:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
fillDataUsingCodeAbove();
}
これを UI スレッドで実行したい理由は、リスト項目を選択した場合、または ListView の特定の位置までスクロールした場合に、デバイスを回転させたり、キーボードなどを取り出したり (構成をトリガーするため) するためです。変更) アクティビティが再開されると、Android は onCreate の直後に状態を復元しようとします。しかし、別のスレッドで実行すると、そうではありません。また、クールなフェードイン アニメーションもあります :)
UI スレッドで実行する際の問題は、サービスにバインドしようとすると、そのサービス バインド リクエストがメッセージ キューに入れられることです。しかし、ループに入ると、メッセージ キューのループを停止します。サービスがバインドされるのを待っているため、プログラムがハングし、ループが終了するまでサービスはバインドされません。私は置くことを考えましたLooper.loop()
私のループの中で、しかしそれはただそれをハングアップさせます
(Looper.loop()
理由はわかりません)
。