0

私の 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()理由はわかりません)

4

1 に答える 1

0

AsyncTaskを使用する必要があると思います。これは UI スレッドをロケートせず、既に持っているものよりもはるかに複雑になることはありません。

于 2010-06-09T20:29:16.093 に答える