AsyncTask用法

时间:2013-01-03 08:16:22

标签: android android-asynctask

我有一个关于使用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[]{});
        }
    }
}

1 个答案:

答案 0 :(得分:1)

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

如果您想要一个可用于应用程序生命周期的上下文,则应使用不需要活动Activity的getApplicationContext()(因此不应该用于修改Activity)。 / p>

不正确的使用也会导致垃圾收集问题 - 对象会浮动。

正如你的问题的评论部分所提到的,最好的方法是,如果你希望能够在应用程序不在前台时运行AsyncTask(即在没有用户的情况下在后台运行)需要输入),是创建服务,AsyncTask可以在其中运行。

服务将拥有您自己可以使用的上下文,如果您希望在两者之间进行直接通信,则可以将服务绑定到您的活动。

有关服务的详细信息,请参阅this Android Developer Article,其中提供了有关其使用的概述