私のユースケースは、(およそ)最初の起動時に次のようである:アンドロイドSTARTSERVICEは()UIスレッドに戻るには長い時間がかかる
- 活動が
- サービスが取得するサービスを開始し、データベース にデータを保存します
- サービスは、今、私は番目の間、プログレスバーを表示したい
意図
startService(new Intent(getApplicationContext(), UpdateDataService.class));
は、UIスレッドに「戻ってくる」に非常に長い時間がかかります。それは同期機能(またはnot?)のようです。サービスクラスが空の場合、startServiceコマンドはほとんど瞬時に処理されます。 UIスレッドはSericeがその作業を処理するのを待っているようですが、それはまったく意味がありません。私はUIスレッドでプログレスバーを表示している間にサービスを非同期タスクとして開始するように(愚かなように)始めようとしました。奇妙なことに、これは時々動作します。それ以外の場合は、サービスが動作している間に白い画面が表示され、その後は1ミリ秒のプログレスバーとUIが表示されます。
私の質問:UIをブロックせずにサービスを開始するにはどうすればよいですか?ガイドトピックServicesから
public class MyClass extends TabActivity {
private ProgressDialog pd;
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent intent = null;
//building some tabs here, setting some text views....
// starting service if does not exist yet
boolean serviceRunning = false;
final ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
for (final RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if ("aegir.mobile.UpdateDataService".equals(service.service.getClassName())) {
serviceRunning = true;
Log.i(MY_APP_TAG, "Service found.");
}
}
if (!serviceRunning) {
pd = ProgressDialog.show(this, "Loading...", "Setting up data.", true, false);
new StartServiceAsync().execute("");
}
}
private final Handler handler = new Handler() {
@Override
public void handleMessage(final Message msg) {
pd.dismiss();
}
};
public class StartServiceAsync extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(final String... params) {
// starting service
startService(new Intent(getApplicationContext(), UpdateDataService.class));
return null;
}
@Override
protected void onPostExecute(final String result) {
handler.sendEmptyMessage(0);
super.onPostExecute(result);
}
}
フム、呼び出し完了する時期。私はスレッドを開始すると、別のスレッドが並列に実行されることになると考えました。これは間違っているようです。私は、私のサービスの「仕事」を非同期タスクに入れようとします。ありがとうございました – Redfox