2014-02-19 23 views
0

我使用的AsyncTask發送電子郵件:給予反饋給用戶時的AsyncTask failes

class AsyncSendEmail extends AsyncTask<String, Void, String> { 

private Exception exception; 
Session session; 

public AsyncSendEmail(Session _session) 
{ 
    session = _session; 
} 

protected String doInBackground(String... parms) { 
    try { 

      MimeMessage message = new MimeMessage(session); 
      DataHandler handler = new DataHandler(new ByteArrayDataSource(parms[1].getBytes(), "text/plain")); 
      message.setSender(new InternetAddress(parms[2])); 
      message.setSubject(parms[0]); 
      message.setDataHandler(handler); 
      if (parms[2].indexOf(',') > 0) 
       message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(parms[2])); 
      else 
       message.setRecipient(Message.RecipientType.TO, new InternetAddress(parms[2])); 
      Transport.send(message); 
      return "SUC"; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return "FLD"; 
    } 
} 

的methos調用:

public synchronized void sendMail(String subject, String body, String sender, String recipients) throws Exception 
{ 
    new AsyncSendEmail(session).execute(subject,body,sender,recipients); 
} 

當我的 「doInBackground」 方法excecutes和failes我想提醒用戶使用通知。

我怎樣才能做到這一點?我如何從方法調用中捕獲異常?

或者我怎樣才能得到一個上下文,所以我可以顯示通知?

+0

您可以製作一個標誌,指示發送失敗並在onPostExecute中檢查標誌併發出通知 –

回答

0

在你的AsyncTask:

private Exception lastException = null; 

protected String doInBackground(String... parms) { 
    try { 

     MimeMessage message = new MimeMessage(session); 
     DataHandler handler = new DataHandler(new ByteArrayDataSource(parms[1].getBytes(), "text/plain")); 
     message.setSender(new InternetAddress(parms[2])); 
     message.setSubject(parms[0]); 
     message.setDataHandler(handler); 
     if (parms[2].indexOf(',') > 0) 
      message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(parms[2])); 
     else 
      message.setRecipient(Message.RecipientType.TO, new InternetAddress(parms[2])); 
     Transport.send(message); 
     return "SUC"; 
} catch (Exception e) { 
    e.printStackTrace(); 
    /* 
    * Remember this exception for when onPostExecute is called. 
    */ 
    this.lastException = e; 
    return "FLD"; 
} 

}

然後檢查onPostExecute lastException的狀態():

protected void onPostExecute(String s) { 
    if (lastException != null) { 
     // Do the notification here. You might need to set a context field on this 
     // AsyncTask prior to invoking it if you need this here. 
    } 
} 
0

首先,你應該通過在構造函數的上下文參數:

private Context mContext; 

public AsyncSendEmail(Context context, Session _session) 
{ 
    mContext = context; 
    session = _session; 
} 

然後,只要需要上下文(例如創建通知),就可以在類中引用mContext

爲了存儲成功/失敗,我會向類中添加一個布爾屬性(可能爲mSuccess),並在檢測到(在doInBackground()之內)消息已成功發送後,將其設置爲true。

然後,覆蓋onPostExecute()

@Override 
protected void onPostExecute(String s) { 
    if (mSuccess) { 
    // Do something when the email has been successfully sent 
    } 
    else { 
    // Show error notification 
    } 
} 

記住,doInBackground()是在後臺線程執行,但onPostExecute()之後doInBackground()已完成運行主/ UI線程上執行。

0

AsyncTask的onPostExecute()方法用於向用戶提供有關AsyncTask內發生的事情的輸出。既然你不能將一個Exception傳遞給onPostEexecute()(理論上,你可以 - 但傳遞非常規結果顯然更重要),在你的情況下,最好的選擇是設置一個標誌,取決於是否該方法通過或失敗,然後在onPostExecute()中讀取此標誌,然後繼續執行您需要執行的任何操作。

相關問題