Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 440
#1

Dropbox: syncNowAndWait в AsyncTask - Программирование Android

03.02.2016, 12:18. Просмотров 206. Ответов 10
Метки нет (Все метки)

В doInBackground() выгружаю данные на Dropbox, отображая ProgressDialog.
По кнопке Cancel (в диалоге) срабатывает событие onCancelled().
Но если я при выгрузке на Dropbox применяю syncNowAndWait(), чтобы дождаться синхронизации, то нажатие Cancel в момент синхронизирования не приводит ни к вызову onPostExecute() ни к вызову onCancelled().
Почему так?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.02.2016, 12:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Dropbox: syncNowAndWait в AsyncTask (Программирование Android):

Dropbox. Странности с подключением - Программирование Android
В "App Console" создал Application. В Android-проекте выставил "App key" и "App secret", запустил и подключился к Dropbox. Создаю...

Миграция на Dropbox API v2 - Программирование Android
С 28.06.2017 Dropbox API v1 больше не будет работать. В консоли разработчика есть инструкция по миграцию на API v2 . Я не могу понять,...

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

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

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

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

10
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,071
03.02.2016, 12:24 #2
В AsyncTask криво сделан сancel, но гайды найти можно (может и на форуме есть), в свое время я тоже сталкивался с этим.
0
Pablito
2525 / 2004 / 624
Регистрация: 12.05.2014
Сообщений: 7,030
Завершенные тесты: 1
03.02.2016, 12:30 #3
все там нормально сделано, просто задачу прервать в джаве невозможно
поэтому в postExecute, перед тем как что-то делать, надо проверять была ли задача cancel или нет
if (isCanceled()) бла бла
кроме этого есть еще метод onCanceled который в доках рекомендуется переопределять и выносить туда код
1
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 440
03.02.2016, 13:41  [ТС] #4
Цитата Сообщение от Паблито Посмотреть сообщение
поэтому в postExecute, перед тем как что-то делать, надо проверять была ли задача cancel или нет
if (isCanceled()) бла бла
В том то и дело, что в этом случае ни onPostExecute() ни onCancelled() не вызываются

Добавлено через 48 минут
Я так подозреваю, что несмотря на вызов
Java
1
my_task.cancel(true);
Процесс продолжает выполняться.
0
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,071
03.02.2016, 14:13 #5
Я не стал заморачиваться.
В doInBackground
Java
1
if (isCancelled()) return null;
В onPostExecute
Java
1
if (result != null) бла бла
1
Pablito
2525 / 2004 / 624
Регистрация: 12.05.2014
Сообщений: 7,030
Завершенные тесты: 1
03.02.2016, 14:23 #6
Цитата Сообщение от Slon747 Посмотреть сообщение
Я так подозреваю, что несмотря на вызов
my_task.cancel(true);
Процесс продолжает выполняться.
именно, я об этом и говорю
Цитата Сообщение от Rube Посмотреть сообщение
Я не стал заморачиваться.
и об этом ) я так тоже делал
1
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 440
03.02.2016, 14:56  [ТС] #7
Цитата Сообщение от Rube Посмотреть сообщение
Я не стал заморачиваться.
В doInBackground
if (isCancelled()) return null;
В onPostExecute
if (result != null) бла бла
У меня везде понатыкано:
Java
1
2
if (isCancelled())
  return null;
Но при нажатии Cancel только диалог исчезает, а процесс продолжает висеть на syncNowAndWait()
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
03.02.2016, 16:15 #8
Slon747, товарищ. Вы пробовали читать про syncNowAndWait? Это не обычный процесс, насколько я понимаю.
0
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 440
03.02.2016, 16:22  [ТС] #9
Цитата Сообщение от CoolMind Посмотреть сообщение
Slon747, товарищ. Вы пробовали читать про syncNowAndWait? Это не обычный процесс, насколько я понимаю.
Читал. Может и не обычный процесс. Но что посоветуете?
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
03.02.2016, 16:40 #10
Slon747, заглянул в https://www.dropbox.com/developers-v1/sync/docs/android, там как-то всё мутно. Вообще, вы правы, странно, что AsyncTask не завершается.
Думаю, следует добавить обратные вызовы и, может быть, вообще убрать syncNowAndWait из AsyncTask (или поместить во Thread). Обратный вызов такой, наверное:
Java
1
void addSyncStatusListener(SyncStatusListener l)
или такой:
Java
1
void addPathListener(PathListener l, DbxPath path, Mode mode)
1
Pablito
2525 / 2004 / 624
Регистрация: 12.05.2014
Сообщений: 7,030
Завершенные тесты: 1
03.02.2016, 16:50 #11
есть такое, я не умею хорошо доносить мысль, поэтому дубль два

В джаве нельзя вот просто так взять и убить Thread, можно только вызвать cancel();
Если в этом асинктаске был бы бесконечный цикл - никаких проблем, в цикле проверяем isCanceled() и все.
Но если там стартует другая асинхронная задача, например http connect или как в данном случае синхронизация то все немного по-другому.

Не получится просто взять и убить это все. Поэтому вызываем cancell() и забиваем на этот асинктаск.
Когда он отработает, проверяем isCancelled() и если задача была "канцельнута" то не делаем ничего. Иначе пытаемся передать данные куда требуется.

Мне лениво читать API дропбокса, я как-то раз делал чтение-запись файлов оттуда-туда и уже не помню всего.
Там может где-то можно просто указать таймаут для этой синхронизации. Все равно когда то этот методо тработает или вернет исключение и тогда асинктаск проснется и заработает дальше - onPostExecute и все такое. Где его и будет ждать проверка о которой я написал выше.
1
03.02.2016, 16:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2016, 16:50
Привет! Вот еще темы с ответами:

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

AsyncTask+CheckBox - Программирование Android
Здравствуйте, интересует вопрос нужно в функцию AsyncTask послать несколько строк, в зависимости какие Чекбоксы чекнуты. Ну например: ...

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

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


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

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

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