Мой пример использования (примерно) следующий при первом запуске:
- действие запускает службу
- служба получает и сохраняет данные в базе данных
- служба уведомляетактивность с намерением
- активность отображает данные
Теперь я хочу отображать индикатор выполнения, когда служба занята.Проблема в том, что
startService(new Intent(getApplicationContext(), UpdateDataService.class));
требуется очень много времени, чтобы «вернуться» в поток пользовательского интерфейса.Кажется, это синхронизированная функция (или , а не ?).Если класс обслуживания пуст, команда startService обрабатывается практически мгновенно.Кажется, поток пользовательского интерфейса ждет, пока Serice справится со своей работой, что не имеет никакого смысла.Я попытался запустить (как бы глупо это ни казалось), чтобы запустить службу как асинхронную задачу, отображая индикатор выполнения в моем потоке пользовательского интерфейса.Как ни странно, иногда это работает.В других случаях я просто получаю белый экран во время работы моего сервиса, а затем - миллисекунду с индикатором прогресса, а затем и мой пользовательский интерфейс.
Теперь мой вопрос: как запустить службу без блокировки моего интерфейса?
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);
}
}