Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Опа!!
15 / 15 / 0
Регистрация: 30.09.2009
Сообщений: 89
#1

AsyncTask - не заходит в блок onCanceled - Программирование Android

13.11.2011, 22:16. Просмотров 936. Ответов 0
Метки нет (Все метки)

Доброго времени суток.

Имеется AsyncTask класс с методами doInBackround, onPostExecute и onCanceled соотвтественно:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
private class ParseTrack extends AsyncTask<HtmlParser, Void, Elements> {
 
        @Override
        protected Elements doInBackground(HtmlParser... parser) {
            try {
                parser[0].loadData();
            } catch (IOException ioException) {
                                cancel(true);
                Log.e("OwnError", "NetError: " + ioException.getMessage());
                // parsing or network error
                Runnable networkIssueToast = new Runnable() {
 
                    public void run() {
                        Toast.makeText(AddPackage.this, "Loading error, try again",
                                Toast.LENGTH_LONG).show();
                    }
                };
 
                // show toast in the UI thread
                runOnUiThread(networkIssueToast);
 
            } catch (Throwable critException) {
                                cancel(true);
                Log.e("OwnError", "CritError: " + critException.getMessage());
                // critical error
                Runnable critIssueToast = new Runnable() {
 
                    public void run() {
                        Toast.makeText(AddPackage.this, "Critical error",
                                Toast.LENGTH_LONG).show();
                    }
                };
                // show toast in the UI thread
                runOnUiThread(critIssueToast);
            }
 
            if (parser[0] != null) {
                return parser[0].getLoadedData();
            } else {
                return null;
            }
        }
 
        // calls if AsyncTask is completed because of an error
        @Override
        protected void onCancelled() {
            mProgDialog.dismiss();
            Log.e("OwnError", "error, AsyncTask canceled");
        }
 
        // calls after succesfull executing doInBackground
        protected void onPostExecute(Elements trackInfo) {
            mProgDialog.dismiss();
 
            if (trackInfo != null) {
                Package newPackage = new Package(
                        mId_edit.getText().toString(), // id
                        mDesc_edit.getText().toString(), // package name
                        mParser.getLink(), // link for parsing
                        new Date(), // create track date
                        new Date(), // last update, now the same as create
                        CarrierSwitcher.getCarrier(), // carrier type
                        mParser.getLoadedData()); // loaded via network data
 
                // object created, now put its into DB
                if (!isExistsInDb(newPackage.getId(), newPackage.getService())) {
                    packageToDb(newPackage);
                } else {
                    Toast.makeText(AddPackage.this,
                            "Package with the same ID & carrier already added!",
                            Toast.LENGTH_LONG).show();
                    // TODO: may be I should call isExistsInDb at the beginning,
                    // before data loading?
                }
 
            } else {
                Toast.makeText(AddPackage.this, "Loading error",
                        Toast.LENGTH_LONG).show();
            }
        } // onPostExecute
    } // ParseTrack class
В случае вылета эксепшна IOException, вызываю cancel(true), что, по идее, должно завершить асинхронную задачу и, как говорит документация, гарантированно зайти в onCanceled, минуя doInBackround. Эксепшн вылетает, но захода в onCanceled не следует никаким образом. Почему так случается - не понимаю, есть какие-нибудь идеи, товарищи? Мне кажется, что при вылете IOException асинхронный поток заверщается самостоятельно и к моменту вызова cancel(true) в обработчике исключений он уже итак завершен, но почему то такое завершение аварийным не считается и я все равно попадаю в doInBackround...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2011, 22:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос AsyncTask - не заходит в блок onCanceled (Программирование Android):

AsyncTask - Программирование Android
Использую AsyncTasc class MyT extends AsyncTask&lt;Void, Void, Void&gt; { @Override protected Void doInBackground(Void......

AsyncTask - Программирование Android
Здравствуйте, при использовании двух одинаковых методов получается разный результат. AsyncTask в одном случае успешно передает данные в...

AsyncTask и get() - Программирование Android
Создаю асинхронный процесс, где в onPreExecute() запускаю анимированный ProgressDialog. После выполнения задачи нужно выполнить действия....

AsyncTask - Программирование Android
Привет. Знаю, что в AsyncTask doInBackground() обращатся к компонентам UI нельзя. Когда я пытаюсь обновить вывод (в EditText) в...

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

Работа с AsyncTask - Программирование Android
Попробовал использовать AsyncTask и возник вопрос. У меня есть несколько ф-й, которые парсят текстовые файлы и заполняют таблицы БД. ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2011, 22:16
Привет! Вот еще темы с ответами:

Отмена AsyncTask - Программирование Android
Привет. Есть такой код: @Override protected Void doInBackground(Void... params) { try { Interpret(Source.get()); }...

AsyncTask и Jsoup - Программирование Android
Не работает вот такой код: package com.example.projecta; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import...

AsyncTask и SQLite - Программирование Android
Здравствуйте! У меня в приложении есть БД SQLite, при нажатие на кнопку загрузки, приложение начинает в базу вносить записи. Структура...

Не работает AsyncTask - Программирование Android
Не работает AsyncTask , вот код: private void registerInBackground() { new AsyncTask() { @Override ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru