java - 将变量从 AsyncTask 传递到 doInBackground Android

标签 java android android-asynctask jakarta-mail

代码运行并且我的电子邮件发送,但每当我选中一个框时,主题都不会改变,因为没有调用方法 setSubject() 。知道了。我遇到问题的地方是我应该在哪里调用/放置此方法,以便我可以在我的 doInBackground() 方法中使用该主题。如果我尝试在 doInBackground 之前或任何位置调用 setSubject(),我会收到在同一线程上运行并发任务的错误。我尝试在 onPreExecute() block 中调用 setSubject() ,但仍然收到错误。有人有什么想法吗?这是代码和 LogCat。

public class lastpage extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.lastpage);


}

//method to verify email format using regex pattern
public boolean validateEmail(String email) { 
    Pattern pattern;
    Matcher matcher;
    //set variable to regex email pattern
    final String EMAIL_PATTERN = "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
    pattern = Pattern.compile(EMAIL_PATTERN);
    matcher = pattern.matcher(email);
    if (matcher.matches()) {
        return true;
    }
    return false;

}


 public void sendEmails() {

 AsyncTask<String, Void, Void> myTask = new AsyncTask<String, Void, Void>() {
       private String sub = "Maintenance Request";
           String s = "";
        CheckBox main = (CheckBox) findViewById(R.id.checkBox1);
        CheckBox kitchen = (CheckBox) findViewById(R.id.checkBox2);
        CheckBox bathroom = (CheckBox) findViewById(R.id.checkBox3);
        CheckBox other = (CheckBox) findViewById(R.id.checkBox4); 

     public String setSubject(String subject) {
        sub = subject;
        if (main.isChecked()) subject = subject + " - Main Room";
        if (kitchen.isChecked()) subject = subject + " - Kitchen";
        if (bathroom.isChecked()) subject = subject + " - Bathroom";
        if (other.isChecked()) subject = subject + " - Other";
           return subject;
     }

              s = setSubject(sub); 
        protected Void doInBackground(String... params) {

    String host = "smtp.gmail.com";
    String username = "user@gmail.com";
    String password = "pwd";
    Properties props = new Properties();
    props.put("mail.smtp.ssl.enable", "true");
    Session session = Session.getInstance(props);

     session.setDebug(true);
      EditText e = (EditText) findViewById(R.id.enterEmail);
      EditText g = (EditText) findViewById(R.id.whichApt);

      String f = e.toString().replace("\\s", "");
      String to = "to@yahoo.com";
      String manager = "manager@gmail.com";
      String subject1 = "Maintenance Confirmation";


      MimeMessage msg = new MimeMessage(session);
      MimeMessage msg1 = new MimeMessage(session);


         try {

           msg.setFrom(new InternetAddress(username));
           msg1.setFrom(new InternetAddress(username));
           msg.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(to));
           msg1.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(manager));
           msg.setSubject(subject1);
           msg1.setSubject(s);
           msg.setText("Some really important stuff. Confirmed.");
           msg1.setText("Really important stuff needs attention");
           props.put("mail.smtps.auth", "true");
           props.put("mail.smtp.quitwait", "false");
           Transport t = session.getTransport("smtps");
           try {
               t.connect(host, username, password);
               t.sendMessage(msg, msg.getAllRecipients());
               t.sendMessage(msg1, msg1.getAllRecipients());
           }
           finally {
               t.close();
         } }  
         catch(Exception exc){
             exc.printStackTrace();
         }
        return null;
         }};

         myTask.execute(); }

//method to run when button is clicked
public void buttonclick3(View v) {
    //first extract text for EditText and convert to String
    EditText e = (EditText) findViewById(R.id.enterEmail);
    String email = e.getText().toString();
    //run validateEmail on String and show alert if format is invalid
    if (validateEmail(email) == false) {
         AlertDialog.Builder builder = new AlertDialog.Builder(this);
         builder.setMessage("Please enter a valid Email address.");
         builder.setTitle("Invalid Input!");
         builder.setNeutralButton("OK", new DialogInterface.OnClickListener() {

               @Override
            public void onClick(DialogInterface dialog, int id) {
                   dialog.dismiss();
               }
           });
     builder.show();
    }
    else {

        sendEmails();
    }

    }
    }

这是我在任何地方尝试调用 setSubject() 时得到的 LogCat。

 - 04-14 17:52:09.091: W/dalvikvm(1510): threadid=1: thread exiting with
   uncaught exception (group=0x41bbaa08)
 - 04-14 17:52:09.101: E/AndroidRuntime(1510): FATAL EXCEPTION: main
 - 04-14 17:52:09.101: E/AndroidRuntime(1510): java.lang.IllegalStateException: Could not execute method of the activity
 - 04-14 17:52:09.101: E/AndroidRuntime(1510): at android.view.View$1.onClick(View.java:3626)
 - 04-14 17:52:09.101: E/AndroidRuntime(1510): at android.view.View.performClick(View.java:4231)
 - 04-14 17:52:09.101: E/AndroidRuntime(1510): at android.view.View$PerformClick.run(View.java:17537)
 - 04-14 17:52:09.101: E/AndroidRuntime(1510): at android.os.Handler.handleCallback(Handler.java:725)
 - 04-14 17:52:09.101: E/AndroidRuntime(1510): at android.os.Handler.dispatchMessage(Handler.java:92)
 - 04-14 17:52:09.101: E/AndroidRuntime(1510): at android.os.Looper.loop(Looper.java:158)
 - 04-14 17:52:09.101: E/AndroidRuntime(1510): at android.app.ActivityThread.main(ActivityThread.java:5751)
 - 04-14 17:52:09.101: E/AndroidRuntime(1510): at java.lang.reflect.Method.invokeNative(Native Method)
 - 04-14 17:52:09.101: E/AndroidRuntime(1510): at java.lang.reflect.Method.invoke(Method.java:511)
 - 04-14 17:52:09.101: E/AndroidRuntime(1510): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1083)
 - 04-14 17:52:09.101: E/AndroidRuntime(1510): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:850)
 - 04-14 17:52:09.101: E/AndroidRuntime(1510): at dalvik.system.NativeStart.main(Native Method)
 - 04-14 17:52:09.101: E/AndroidRuntime(1510): Caused by: java.lang.reflect.InvocationTargetException
 - 04-14 17:52:09.101: E/AndroidRuntime(1510): at java.lang.reflect.Method.invokeNative(Native Method)
 - 04-14 17:52:09.101: E/AndroidRuntime(1510): at java.lang.reflect.Method.invoke(Method.java:511)
 - 04-14 17:52:09.101: E/AndroidRuntime(1510): at android.view.View$1.onClick(View.java:3621)
 - 04-14 17:52:09.101: E/AndroidRuntime(1510):  ... 11 more
 - 04-14 17:52:09.101: E/AndroidRuntime(1510): Caused by: java.lang.NullPointerException
 - 04-14 17:52:09.101: E/AndroidRuntime(1510): at com.example.maintenanceapp.lastpage$1.setSubject(lastpage.java:81)
 - 04-14 17:52:09.101: E/AndroidRuntime(1510): at com.example.maintenanceapp.lastpage$1.<init>(lastpage.java:87)
 - 04-14 17:52:09.101: E/AndroidRuntime(1510): at com.example.maintenanceapp.lastpage.sendEmails(lastpage.java:72)

最佳答案

不要尝试在不同的 Activity 上查找复选框。相反,发送 Intent 中所需的信息用于启动下一个 Activity 。

关于java - 将变量从 AsyncTask 传递到 doInBackground Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23072907/

相关文章:

java - 如何为 "BottomNavigationView"设置菜单图标图像,因为它仅显示图像的设计,即结构......?

android - 动态添加页面到 Fragment Page Adapter

android - 无法启动 ImplicitTest

java - 解析数据时出错 java.lang.IllegalStateException : Not on the main thread when populating Google map

java - 如何将 Camel Quartz 集群与队列消费结合使用?

java - 从 C 调用 MATLAB

android - OSMDroid 从 Assets 文件夹加载自定义离线图 block

android - 从网上获取一个.txt,对比一下,在一个AsyncTask中打开一个dialog

java - 使用 Android 进行录制时显示不断更新的 double (频率)

java - jvm 线程 block 计数的 SNMP OID 是多少