大附件导致android javamail中的outofmemory异常

时间:2014-03-11 09:10:10

标签: android javamail

我正在使用javamail将邮件添加到Android应用程序中的文件夹。

在这个应用程序中,我使用来自以下链接的javamail api http://code.google.com/p/javamail-android/downloads/list

我正在为此目的使用IMAP协议。

以下是我的代码。

     // add atachment
      messageBodyPart = new MimeBodyPart();

      DataSource source = new FileDataSource(file.getAbsolutePath()); 

      messageBodyPart.setDataHandler(new DataHandler(source));

      messageBodyPart.setFileName(file.getName()); 


      _multipart.addBodyPart(messageBodyPart); 

然后我使用下面的行将消息附加到文件夹。

          try{
                 Log.v(tag, "Sending Mail");    

                 f.appendMessages(msg1);     

                 sucess_flag=1;
                 Log.v(tag, "Mail Send");
             }
             catch(Exception e)
             {
                e.printStackTrace(); 

             }catch(Throwable e)
             {
                    e.printStackTrace(); 
             }

但我仍然没有内存异常。

我已经尝试过以下代码,但没有成功。        //添加atachment           messageBodyPart = new MimeBodyPart();

     FileInputStream fs=new FileInputStream(file.getAbsoluteFile());
     DataSource source =new ByteArrayDataSource(fs, mimetype);
      messageBodyPart.setDataHandler(new DataHandler(source));

      messageBodyPart.setFileName(file.getName()); 


      _multipart.addBodyPart(messageBodyPart); 

我想如果我创建Inputstream然后它将以小块发送但它不起作用。

1 个答案:

答案 0 :(得分:0)

FileDataSource是正确的方法,或者只是使用attachFile中的newer versions of JavaMail方法。

JavaMail需要在消息附加之前确切地知道消息的大小。为此,它需要读取消息的所有数据。如果消息足够小,它将缓存此数据,以便在发送消息时不必再次读取它。默认情况下,它会尝试将整个消息缓存在内存中。您可以设置mail.imap.appendbuffersize Session property以限制将缓存的邮件的大小。