gpt4 book ai didi

android - AsyncTask 用法

转载 作者:太空狗 更新时间:2023-10-29 14:23:54 27 4
gpt4 key购买 nike

我对使用 Android SDK 提供的 AsyncTask 类有疑问。我正在从 Activity 开始我的代码中的任务,该 Activity 的工作是定期发送电子邮件(按照指定时间)。我在 onPostExecute() 中重新启动任务。它确实定期发送电子邮件,但一段时间后电子邮件停止发送。按后退按钮对它有什么影响吗?

我在 AsyncTask 上浏览了以下链接并发现 AsyncTask 在 Activity 的方向改变或失去焦点后需要刷新。我需要单独处理吗?每次 activity 失去焦点或其方向改变时,我是否需要刷新 context?我正在根据上下文执行某些数据库操作。

这是我的 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[]{});
}
}
}

最佳答案

当您启动一个使用 Activity 上下文的任务时,该任务将在与 Activity 相同的生命周期中运行。当 Activity 被销毁时,它的上下文将随之丢失,如果没有有效的上下文,任务将失败。

如果您想要一个在应用程序的生命周期内可用的上下文,您应该使用不需要 Activity Activity 的 getApplicationContext()(并且不应该用于将 Activity 修改为结果)。

不正确的使用也可能导致垃圾收集问题 - 对象四处漂浮。

正如您问题的评论部分所提到的,如果您希望能够在应用程序不在前台(即在没有用户的后台)时运行 AsyncTask,那么最好的前进方式需要输入),是为了创建一个 AsyncTask 可以在其中运行的服务

服务将有自己的上下文供您使用,如果您希望两者之间直接通信,您可以将服务绑定(bind)到您的 Activity 。

有关服务的更多信息,请参阅 this Android Developer Article其中概述了它们的使用

关于android - AsyncTask 用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14135209/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com