使用电子邮件意图发送包含大量附件的电子邮件会挂起/不启动意图

时间:2016-01-03 12:30:58

标签: android android-intent

我有一个活动,它启动电子邮件意图,传递一个指向本地文件的Uri对象的数组列表。这适用于存在少量文件的情况,例如但是,当我有1000多个文件(总大小为14 mb)时,活动会挂起(预计很多i / o),但它有时会无限期挂起或者当它确实返回意图时没有发射。

下面的代码(由AsyncTask调用)创建Uri的数组列表并启动Email意图:

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模拟器,Nexus 7和Nexus 6p
  • Android:最低19(Kitkat),目标是Kitkat

有谁知道我做错了什么?

3 个答案:

答案 0 :(得分:1)

1000多个文件作为单个邮件的附件?它必须挂起。我看到总尺寸不是太大但附件数量仍然很大。

我能想到的两个解决方案:

  1. 压缩并附上拉链作为单个附件? (请参阅this post了解操作方法)
  2. AsyncTask
  3. 中执行此操作

    如果上述两个中的任何一个到位,您的活动就不会挂起。

答案 1 :(得分:1)

你显然需要使用AsyncTask。 请注意,任何Web事务(下载或上载)都不得在UI线程上执行,并且必须异步处理。

编辑1:在我被告知使用AsyncTask之后。

AsyncTask指南中写道:

  

理想情况下,AsyncTasks应该用于短时间操作(几秒钟)   最多。)如果你需要保持线程长时间运行   时间,强烈建议您使用提供的各种API   java.util.concurrent包,例如Executor,ThreadPoolExecutor   和FutureTask。

显然你的代码运行的时间超过几秒,所以应该使用上面的代码。我使用this教程来学习FutureTask。 试试这个,让我们发布。

答案 2 :(得分:0)

我认为这对其他人有用。我找到的解决方案是将文件压缩成一个zip文件,然后将其附加到电子邮件中。否则它将崩溃而没有报告错误。

HTH