AsyncTask, похоже, не работает действительно асинхронно - PullRequest
0 голосов
/ 28 марта 2012

Я звоню AsyncTask, чтобы остановить ранее запущенную службу.Но ProgressDialog не вращается во время работы Asyctask.Поэтому я думаю, что что-то не так, и у меня могут возникнуть проблемы с ошибкой ANR.

Есть идеи?

new asyncTaskZieladresse().execute();

public class asyncTaskZieladresse extends AsyncTask<Void, Integer, Void> {
    int progress;
    @Override
    protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
        final Spinner Fahrerauswahl = (Spinner)findViewById(R.id.spinner1);
        final Spinner Fahrzeugauswahl = (Spinner)findViewById(R.id.spinner2);
        final Spinner Nutzungsartauswahl = (Spinner)findViewById(R.id.spinner3);
        Cursor mcursor = (Cursor) Fahrerauswahl.getSelectedItem();
        Fahrer = mcursor.getString(mcursor.getColumnIndexOrThrow("name"));
        FahrerID = mcursor.getString(mcursor.getColumnIndexOrThrow("_id"));
        mcursor.close();
        Cursor mcursor1 = (Cursor) Fahrzeugauswahl.getSelectedItem();
        Kennzeichen = mcursor1.getString(mcursor1.getColumnIndexOrThrow("fahrzeug_kennzeichen"));
        KennzeichenID = mcursor1.getString(mcursor1.getColumnIndexOrThrow("_id"));
        mcursor1.close();
        Cursor mcursor2 = (Cursor) Nutzungsartauswahl.getSelectedItem();
        Nutzungsart = mcursor2.getString(mcursor2.getColumnIndexOrThrow("nutzungsart"));
        NutzungsartID = mcursor2.getString(mcursor2.getColumnIndexOrThrow("_id"));
        mcursor2.close();
        VariablenUebergebenGpsFahrt();
        progressDialog.dismiss();
    }
    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        progressDialog = ProgressDialog.show(Main.this, "GPS", "Ziel-Standort wird ermittelt...");
    }
    @Override
    protected void onProgressUpdate(Integer... values) {
        // TODO Auto-generated method stub
    } 
    @Override
    protected Void doInBackground(Void... arg0) {
        // TODO Auto-generated method stub
        stopService(new Intent(Main.this, GPSService.class));
        return null;
    }    

}

Ответы [ 3 ]

1 голос
/ 28 марта 2012

Весь код в onPostExecute будет выполняться в потоке пользовательского интерфейса, в фоновом режиме будет выполняться только код в doInBackground ...

1 голос
/ 28 марта 2012

Вот почему я пытался остановить службу с помощью AsyncTask.

Это не поможет, как я пытался объяснить в комментариях к вашему вопросу. Если onDestroy() занимает слишком много времени, вам нужно выполнить эту работу раньше и в фоновом потоке. Вводить вызов stopService() в фоновом потоке совершенно бессмысленно.

Сам сервис уже работает в фоновом режиме, а не в потоке пользовательского интерфейса.

Нет, это не так.

onDestroy() вызывается в главном потоке приложения. Всегда .

Ваша служба может также иметь собственный фоновый поток для другой работы, но методы жизненного цикла (onCreate(), onStartCommand(), onBind() и onDestroy()) всегда вызываются основная ветка приложения.

Итак, если остановка службы заняла много времени, почему приложение зависло?

Потому что вы делаете слишком много работы в onDestroy().

Служба и команда, ожидающая возврата остановленной службы, не выполняются в потоке пользовательского интерфейса.

onDestroy() вызывается в главном потоке приложения (a.k.a., "UI-thread").


ОБНОВЛЕНИЕ на основании первого комментария:

Когда я вызываю onDestroy () внутри службы

Вы никогда не звоните onDestroy(). Android звонит onDestroy(). Вы не Android.

onDestroy () вызывается не внутри службы для самой службы, а в основном потоке?

Кажется, вы думаете, что сервис - это поток. Это не. Вы можете сказать это, прочитав документацию («Обратите внимание, что службы, как и другие объекты приложений, работают в главном потоке процесса их размещения».). Пожалуйста, прочитайте документацию.

1 голос
/ 28 марта 2012

Трудно понять, почему ANR, но кажется, что многие вещи, которые вы исполняете в onPostExecute(), могут быть перемещены в doInBackground(). Разработчики Android предлагают выполнять sql lite операцию (Content Provider) и каждую тяжелую операцию асинхронно.

...