0

我对 android 很陌生,并尝试使用第 3 部分 api 发送邮件。我完成了几乎所有的编码,然后我发现 android 3.0+ 不允许在主线程上进行网络操作,唯一的方法是将它添加到 Async.Below将活动扩展到异步后是我的代码。但我收到错误“Void 是变量 onCreate 的无效类型”。我不知道变量 onCreate 的有效类型应该是什么。有人可以解决这个问题吗?谢谢

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
//import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class ZZZ extends Activity{
public class done extends AsyncTask<Void, Void, Void>{
    @Override
    protected Void doInBackground(Void... params) {
public void onCreate(Bundle icicle) { 
  super.onCreate(icicle); 
  setContentView(R.layout.activity_main); 

  Button addImage = (Button) findViewById(R.id.send_email); 
  addImage.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View view) { 
      Mail m = new Mail("my@domain.com", "password"); 

      String[] toArr = {"mail1@domain.com", "mail2@domain.com"}; 
      m.setTo(toArr);
      m.setFrom("mymail@gmail.com"); 
      m.setSubject("This is an email sent using my Android device."); 
      m.setBody("Email body."); 

      try { 
        m.addAttachment("/storage/somethinghere"); 

        if(m.send()) { 
          Toast.makeText(ZZZ.this, "Email was sent successfully.", Toast.LENGTH_LONG).show(); 
        } else { 
          Toast.makeText(ZZZ.this, "Email was not sent.", Toast.LENGTH_LONG).show(); 
        }
      } catch(Exception e) { 
        //Toast.makeText(MailApp.this, "There was a problem sending the email.", Toast.LENGTH_LONG).show(); 
        Log.e("MailApp", "Could not send email", e); 
      } 
    } 
  });


}}
}
}
4

1 回答 1

0

哇。我们在这里尝试的是在了解有关 Java(和 Android..)的最基本知识之前进行 Android 开发。在 Java 中,您不能在方法内部定义方法。此外,AsyncTask必须定义您想要在后台完成的精确工作,然后当该工作完成时您希望在主线程上执行什么。您在这里将 与 混合AsyncTask在一起Activity。您已经定义了一个内部类 (the AsyncTask),但是在 的doInBackground方法内部AsyncTask,您开始尝试覆盖该类的onCreate方法Activity。好像复制粘贴出了大错。除非您暂时离开 Android 并学习 Java/通用编程,否则您永远无法解决这些类型的问题。您不能只将任意代码包装在AsyncTask并期望它解决在主线程上执行长时间运行工作的所有问题,因为......好吧,这甚至没有编译。

您需要设置按钮和ActivityonClickListener内部onCreate,然后通过创建您定义的内部类的新实例并调用它来onClick触发它。AsyncTaskexecute()

这是基本结构:

public class ZZZ extends Activity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Button button = new Button(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              new MyTask().execute();
            }
        });
    }


    class MyTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {
            return null;   //do stuff here.
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            //manipulate UI thread here when the background work is done
        }
    }
}
于 2013-04-28T15:37:00.977 回答