【问题标题】:Using email intent to send an email with large number of attachments hangs/doesn't launch intent使用电子邮件意图发送带有大量附件的电子邮件挂起/不启动意图
【发布时间】:2016-01-03 12:30:58
【问题描述】:

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

以下代码(由 AsyncTask 调用)创建 Uri 的数组列表并启动电子邮件意图:

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

有人知道我做错了什么吗?

【问题讨论】:

    标签: android android-intent


    【解决方案1】:

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

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

    1. 压缩并附加一个 zip 作为单个附件? (操作方法请参考this post
    2. AsyncTask 中执行此操作

    使用以上两种方法中的任何一种,您的 Activity 都不会挂起。

    【讨论】:

    • 谢谢,如上所述,我已经在使用 AsyncTask,它从主线程执行代码。在电子邮件意图上调用 startActivity 时会出现问题。
    • 那么我认为您应该尝试查看压缩到 zip 文件并使其成为单个附件。
    • 与其说是挂在应用程序上,不如说是可以理解的。它围绕着应用程序在启动意图(邮件客户端)时崩溃,这很奇怪。我没有收到任何异常或错误,应用程序崩溃并重新启动,没有任何提示出现问题。
    • 可能是邮件客户端处理了异常并发起了重启?
    • @AndroidMechnic,可能但很难确定。我已经放弃了附加这么多文件。从用户的角度来看,处理 1 个文件超过数百个更有意义。
    【解决方案2】:

    您显然需要使用 AsyncTask。 请注意,任何网络事务(下载或上传)都不能在 UI 线程上进行,必须异步处理。

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

    AsyncTask 指南如下:

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

    显然您的代码运行时间超过几秒钟,因此可能应该使用上述代码之一。我使用this 教程来学习FutureTask。 试试这个,让我们知道。

    【讨论】:

    • 谢谢,我应该提到我已经有 asyncTask 调用我共享的代码。启动电子邮件意图时会出现问题。
    • @WolfBane 我更新了答案,看看它是否解决了问题并让我发布。
    • 谢谢。我最终使用了 AsyncTask 和进度条。这对我的要求很好。不幸的是,大量附件导致应用程序在通过 Intent 启动邮件客户端时崩溃。因此,我不得不将文件压缩成一个 zip 并附上。效果很好。
    【解决方案3】:

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

    HTH

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 2013-02-21
      • 2020-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多