2016-01-03 58 views
0

我有一個活動,啓動電子郵件意圖,傳遞Uri對象的數組列表,指向本地文件。這在少量文件例如3或10.但是,當我有1000多個文件(總計大小爲14 MB)時,活動會掛起(這是預期的很多I/O),但它有時會無限期地掛起或者當它返回意圖時, t發射。使用電子郵件意圖發送大量附件的電子郵件掛起/不啓動意圖

下面的代碼(用的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(奇巧)和目標是奇巧

有誰知道我做錯了什麼?

回答

1

1000多個文件作爲附件的單個郵件?它必須掛起。我發現總體尺寸不是很大,但附件數量仍然很大。

兩個解決方案,我能想到的:

  1. 壓縮並附加一個zip作爲單個附件? (請參閱this post對於如何使用)
  2. 到位您的活動不會掛這樣做是一個AsyncTask

與任何上述兩個的。

+0

謝謝,如上所述,我已經使用一個AsyncTask,執行主線程的代碼。在電子郵件意向調用startActivity時出現問題。 – WolfBane

+0

然後我認爲你應該嘗試看壓縮到一個zip文件,並使其成爲一個單一的附件。 – AndroidMechanic

+0

這不像掛斷了應用程序,正如你所提到的那樣可以理解。這是圍繞應用程序崩潰開始意圖(郵件客戶端),這是好奇。我沒有收到任何例外或錯誤,應用程序崩潰並重新啓動,沒有提示出了什麼問題。 – WolfBane

1

你顯然需要使用AsyncTask。 請注意,任何Web事務(下載或上傳)都不能在UI線程上執行,並且必須異步處理。

編輯1:在我被告知AsyncTask被使用後。

中的AsyncTask指南上寫着:

AsyncTasks應該理想地用於短操作(在幾秒鐘 最)如果您需要保持線程運行的 很長一段時間,這是非常建議您使用由諸如Executor,ThreadPoolExecutor 和FutureTask之類的java.util.concurrent包提供的各種API。

顯然你的代碼運行時間超過了幾秒鐘,所以應該使用上面的代碼。我使用this教程來學習FutureTask。 試試這個,並保持我們發佈。

+0

謝謝,我應該提到我已經有asyncTask調用我共享的代碼。啓動電子郵件意圖時出現此問題。 – WolfBane

+0

@WolfBane我更新了答案,看它是否解決了問題並保持發佈。 –

+0

謝謝。我已經結束了使用AsyncTask和一個進度條。這對我的要求適用。不幸的是,大量附件導致應用程序在通過Intent啓動郵件客戶端時崩潰。因此,我不得不將這些文件壓縮成一個zip文件並附上該文件。哪些工作正常。 – WolfBane

0

我認爲這可能對其他人有用。我找到的解決方案是將這些文件壓縮成一個zip文件,然後將其附加到電子郵件中。否則,它會崩潰而沒有報告錯誤。

HTH

相關問題