2016-01-03 4 views
0

У меня есть активность, которая запускает намерение электронной почты, передавая список массивов объектов Uri, указывающих на локальные файлы. Это работает, когда имеется небольшое количество файлов, например. 3 или 10. Однако, когда у меня есть 1000+ файлов (суммарно размером 14 мб), активность зависает (что ожидается, много ввода-вывода), однако иногда она зависает бесконечно или когда она возвращает намерение, t запуска.Использование электронной почты для отправки электронной почты с большим количеством вложений зависает/не запускает намерение

Ниже кода (так называемый с помощью AsyncTask) создает список массива из Ури и запускает E-mail Цель:

private Intent createEmailAndSend(List<FilePath> paths) { 
    Intent emailIntent = new Intent(Intent.ACTION_SEND_MULTIPLE); 
    emailIntent.setType("message/rfc822"); 
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject"); 

    ArrayList<Uri> fileUriList = new ArrayList<>(); 

    for (FilePath filePath : paths) { 
     File file = new File(filePath.getPath()); 
     fileUriList.add(Uri.fromFile(file)); 
    } 

    emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, fileUriList); 

    startActivity(intent); 
} 

Тестирование на:

  • Genymotion, Android Studio 2 Beta Emulator, Nexus 7 и Nexus 6p
  • Android: Минимум 19 (Kitkat), и цель Kitkat

Кто-нибудь знает, что я делаю неправильно?

ответ

1

1000+ файлов вложения в одну почту? Он должен висеть. Я вижу, что общий размер не слишком большой, но количество вложений огромно.

Два решения я могу думать:

  1. Compress и прикрепляются застежка-молния как одного вложения? (См this post для того, как к)
  2. ли это в AsyncTask

С любой из вышеупомянутых двух в месте вашей деятельности обыкновение вешать.

+0

Спасибо, как уже упоминалось выше, я уже использую AsyncTask, который выполняет код с основного потока.Проблема возникает при вызове startActivity по намерению электронной почты. – WolfBane

+0

, тогда я думаю, вы должны попробовать и посмотреть на сжатие на zip-файл и сделать его одним вложением. – AndroidMechanic

+0

Это не столько висит приложение, понятное, как вы упомянули. Это связано с сбоем приложения при запуске намерения (почтового клиента), что любопытно. Я не получаю никаких исключений или ошибок, приложение терпит неудачу и перезагружается, никаких намеков на то, что пошло не так. – WolfBane

1

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

EDIT 1: после того, как мне сказали, была использована AsyncTask.

руководство AsyncTask гласит:

AsyncTasks в идеале должны быть использованы для коротких операций (. Несколько секунд в лучшем случае) Если вам нужно сохранить темы работы в течение длительных периодов времени, весьма рекомендуется использовать различные API, предоставленные пакетом java.util.concurrent, таким как Исполнитель, ThreadPoolExecutor и FutureTask.

Очевидно, что ваш код работает дольше нескольких секунд, поэтому, вероятно, следует использовать один выше. Я использовал this учебник, чтобы узнать FutureTask. попробуйте это и сохраните нас в курсе.

+0

Спасибо, я должен был упомянуть, что у меня уже есть asyncTask, который вызывает код, который я поделил. Проблема возникает при запуске намерения электронной почты. – WolfBane

+0

@ WolfBane Я обновил ответ, посмотрю, решает ли он проблему и держит меня в курсе. –

+0

Спасибо. Я закончил использование AsyncTask и индикатор прогресса. Что отлично подходит для моих требований. К сожалению, большое количество вложений приводит к сбою приложения при запуске почтового клиента через Intent. Поэтому мне пришлось заархивировать файлы в один почтовый ящик и прикрепить их. Что хорошо работает. – WolfBane

0

Я думал, что это может быть полезно для других. Решение, которое я нашел, состояло в том, чтобы закрепить файлы в один ZIP-файл, а затем прикрепить его к электронной почте. В противном случае он выйдет из строя, не сообщая об ошибках.

HTH

Смежные вопросы