我有一个关于使用Android sdk提供的AsyncTask
类的问题。我正在我的代码中开始一项任务,该活动的工作是定期发送电子邮件(按照指定的时间)。我在onPostExecute()
中重新启动了该任务。它会定期发送电子邮件,但一段时间后电子邮件就会停止发送。按下后退按钮会对它产生影响吗?
我正在浏览AsyncTask上的以下链接,发现AsyncTask
需要在活动结束后刷新。方向改变或失焦。我需要单独处理吗?每当context
失焦或其方向发生变化时,我是否需要刷新activity
?我正在根据上下文进行某些数据库操作。
这是我的AsyncTask
代码:
public class SendEmailTask extends AsyncTask<String, Void, String> {
private static final String LOG_TAG = "EmailTask";
private static final int MESSAGE_SENT = StringConstants.CONSTANT_YES_FLAG;
private Context context;
public SendEmailTask(Context context) {
this.context = context;
}
@Override
protected String doInBackground(String... time) {
// String message = "Message sent at ";
try{
//DB operations
Validator validator = new Validator(context);
int emailInterval = validator.validForSendingEmail(settingsMap);
String emailId = settingsMap.get(DBSetting.COLUMN_EMAILID);
String emailPwd = settingsMap.get(DBSetting.COLUMN_EMAIL_PWD);
if (emailId != null && emailPwd != null && emailInterval > 0) {
Thread.sleep((Integer.valueOf(emailInterval) * 60000));
// TODO: formatting of email body
DALLog dalLog = DALLog.getDALLogInstance();
dalLog.init(context);
GMailSender sender = new GMailSender(emailId, emailPwd);
sender.sendMail("Mail From Auto responder",
result, emailId,
emailId);
dalLog.close();
}
return null;
}
catch (NumberFormatException e) {
e.printStackTrace();
Log.d(LOG_TAG, e.getMessage());
}
catch (InterruptedException e) {
e.printStackTrace();
Log.d(LOG_TAG, e.getMessage());
}
catch (Exception e) {
Log.d(LOG_TAG, e.getMessage());
}
return null;
}
@Override
protected void onPostExecute(String result) {
//DB operations
Validator validator = new Validator(context);
int emailInterval = validator.validForSendingEmail(settingsMap);
// Start EmailTask thread if not started already
SendEmailTask emailTask = new SendEmailTask(context);
if (emailTask.getStatus() != AsyncTask.Status.RUNNING) {
emailTask.execute(new String[]{});
}
}
}
答案 0 :(得分:1)
当您启动使用Activity上下文的任务时,该任务将在与Activity相同的生命周期中运行。当Activity被销毁时,它的上下文将随之丢失,如果没有有效的上下文,任务将失败。
如果您想要一个可用于应用程序生命周期的上下文,则应使用不需要活动Activity的getApplicationContext()
(因此不应该用于修改Activity)。 / p>
不正确的使用也会导致垃圾收集问题 - 对象会浮动。
正如你的问题的评论部分所提到的,最好的方法是,如果你希望能够在应用程序不在前台时运行AsyncTask(即在没有用户的情况下在后台运行)需要输入),是创建服务,AsyncTask可以在其中运行。
服务将拥有您自己可以使用的上下文,如果您希望在两者之间进行直接通信,则可以将服务绑定到您的活动。
有关服务的详细信息,请参阅this Android Developer Article,其中提供了有关其使用的概述