没有参数的AsyncTask

时间:2017-01-04 13:09:05

标签: java android android-asynctask

我想发送我的应用程序的背景并发送电子邮件。 我按照这个例子实现了它 http://javapapers.com/android/android-email-app-with-gmail-smtp-using-javamail/

public class SendMailTask extends AsyncTask {

    private ProgressDialog statusDialog;
    private Activity sendMailActivity;

    public SendMailTask(Activity activity) {
        sendMailActivity = activity;

    }

    protected void onPreExecute() {
        statusDialog = new ProgressDialog(sendMailActivity);
        statusDialog.setMessage("Getting ready...");
        statusDialog.setIndeterminate(false);
        statusDialog.setCancelable(false);
        statusDialog.show();
    }

    @Override
    protected Object doInBackground(Object... args) {
        try {
            Log.i("SendMailTask", "About to instantiate GMail...");
            publishProgress("Processing input....");
            GMail androidEmail = new GMail(args[0].toString(),
                    args[1].toString(), (List) args[2], args[3].toString(),
                    args[4].toString());
            publishProgress("Preparing mail message....");
            androidEmail.createEmailMessage();
            publishProgress("Sending email....");
            androidEmail.sendEmail();
            publishProgress("Email Sent.");
            Log.i("SendMailTask", "Mail Sent.");
        } catch (Exception e) {
            publishProgress(e.getMessage());
            Log.e("SendMailTask", e.getMessage(), e);
        }
        return null;
    }

    @Override
    public void onProgressUpdate(Object... values) {
        statusDialog.setMessage(values[0].toString());

    }

    @Override
    public void onPostExecute(Object result) {
        statusDialog.dismiss();
    }

}

代码工作正常 但是,我有一个演示文稿,我需要解释代码。 在代码中,SendMailTask​​扩展了AsyncTask,没有任何额外的参数,甚至没有Void

我坚持这一点,因为我搜索过,没有人用这种方式。 任何人都可以向我解释一下吗?

3 个答案:

答案 0 :(得分:0)

如果你没有指定任何Generic参数,你会看到它将java.util.Scanner[delimiters=\p{javaWhitespace}+][position=0][match valid=false] [need input=false][source closed=false][skipped=false][group separator=\,] [decimal separator=\.][positive prefix=][negative prefix=\Q-\E][positive suffix=] [negative suffix=][NaN string=\Q?\E][infinity string=\Q?\E] /*Pseudocode: Text: Input Text to Encrypt "User Input" Text: "User input output for test pourposes" */ Scanner enc = new Scanner(System.in); System.out.println("Input Text to encrypt"); System.out.println(enc); } } 作为一种类型(所有类的基类)

因此,仅使用Object

您实际上正在处理AsyncTask

例如 - 请参阅给定链接中的Object参数

答案 1 :(得分:0)

没有参数,AsyncTask将采用默认类(即Object)

public class SendMailTask extends AsyncTask <Object1, Object2, Object3> {

    @Override
    protected Object doInBackground(Object1... args) {
    ...    

       //publishProgress calls "onPublishProgress" method
       //e.g. publishProgress("email sent.");  
       publishProgress(object2); 

       //last line returns to "onPostExecute" method
       //e.g. return null;
       return object3; 
    }

    @Override
    public void onProgressUpdate(Object2... values) {
    ...

    }

    @Override
    public void onPostExecute(Object3 result) {
    ...
    } 
}

Object1是初始化asyncTask时传入的参数数组

            new SendMailTask(SendMailActivity.this).execute(fromEmail,
                    fromPassword, toEmailList, emailSubject, emailBody);

所以fromEmail,fromPassword等等都进入了Object1的数组。 您可以使用arg [index]在doInBackground方法中访问它们。

答案 2 :(得分:0)

老实说,他们扩展AsyncTask的方式并不是非常聪明。它会在Android Studio中引发一些令人讨厌的警告,并且扩展AsyncTask<Object, Object, Object>同样容易,但效果相同,但它会删除警告。

所有这些都表示,为了使用该课程,您只需拨打以下电话:

Object[] args = new Object[]{
    arg1,
    arg2,
    etc
};
new SendMailTask(activity).execute(args);

您只需要检查GMail构造函数,看看您应该如何订购args。