размещение нескольких изображений в сервисе с обратной связью на экране

Я новичок в Android-разработке, и мне есть, чем заняться. У меня концептуальный вопрос. То, что кажется довольно простым в IOS, я не могу понять в Android.

Вот что я пытаюсь выполнить:

Мне нужно перебирать фотографии устройств и публиковать их по одной на каком-то веб-сервисе.

  • во время загрузки изображения мне нужно показать текущую загружаемую фотографию на экране вместе с индикатором выполнения текущей загрузки.
  • Мне также нужно показать общее количество фотографий, оставшихся для загрузки.
  • Наряду с этим мне нужно иметь 2 кнопки на экране - «Отменить текущую загрузку» и «Приостановить все» (надеюсь, это довольно понятно, что эти кнопки должны делать).

Проблема в том, что при итерации через MediaStore он как бы блокирует текущий поток и, если я делаю это в основном потоке пользовательского интерфейса, то, очевидно, изображения будут загружаться, но я не увижу ничего на экране, пока все загрузки сделаны. Чтобы преодолеть это, я пытаюсь запустить новую AsyncTask и повторять ее таким образом. Для загрузки я использую библиотеку loopj, которая может загружать асинхронно только тогда, когда загрузка начинается из основного потока пользовательского интерфейса. Поскольку загрузка начинается с потока, в котором выполняется AsychTask, я вынужден использовать синхронный клиент, который не возвращает дескриптор ответа до тех пор, пока загрузка не будет завершена, что означает, что я никогда не смогу отменить текущую операцию загрузки. Чтобы преодолеть это, я пытаюсь создать новое намерение для каждой загрузки изображения из итератора AsynchTask и ждать, пока оно вернется, пока не перейдет к следующему циклу интерлятора, который имеет ужасный вид - экраны намерений всплывают и складываются с анимацией, которая слишком раздражает и выглядит ужасно. Ох, решение, которое я описываю, такое сложное. Я уверен, я упускаю из виду что-то глупое простое. Любые идеи будут высоко оценены!

P.S. Код можно найти здесь: https://github.com/echowaves/Echowaves.android/blob/master/app/src/main/java/com/echowaves/android/UploadProgressActivity.java https://github.com/echowaves/Echowaves.android/blob/master/app/src/main/java/com/echowaves/android/UploadProgressDetailsActivity.java


person dmitryame    schedule 03.08.2014    source источник


Ответы (1)


У меня есть несколько рабочее решение. Вместо того, чтобы запускать новое намерение для каждой загрузки, я просто перебираю ресурсы MediaStore в AsynchTask и запускаю асинхронную загрузку внутри onProgressUpdate, и, поскольку (если я правильно понимаю) onProgressUpdate работает в основном потоке пользовательского интерфейса, обновление пользовательского интерфейса работает как шарм . Тем не менее, все же придется пошутить с установкой флага, указывающего, что загрузка в данный момент активна, спящего режима в течение 100 мс, проверки наличия флага и после завершения загрузки перейти к следующему изображению в курсоре.

Последний код обновлен на github: https://github.com/echowaves/Echowaves.android/blob/master/app/src/main/java/com/echowaves/android/UploadProgressActivity.java

person dmitryame    schedule 04.08.2014