我是android的新手,尝试用第三方api发送邮件。我做了几乎所有的编码,然后我发现android 3.0+不允许在主线程上做网络操作,唯一的方法是在异步中添加它。下面是我的代码扩展到异步活动后。但我得到一个错误"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);
}
}
});
}}
}
}
哇。在了解Java(和Android..)的最基本知识之前,我们尝试做Android开发。在Java中,不能在方法内部定义方法。此外,AsyncTask
必须定义您想要在后台完成的精确工作,然后当该工作完成时,您希望在主线程上执行什么。你在这里混合AsyncTask
和Activity
。您已经定义了一个内部类(AsyncTask
),但是随后在AsyncTask
的doInBackground
方法中,您开始尝试覆盖Activity
类的onCreate
方法。好像是复制粘贴出了大错。除非你暂时远离Android,学习Java/通用编程,否则你永远无法解决这些问题。你不能只是在AsyncTask
中包装任意的代码,并期望它能解决在主线程上执行长时间工作的所有问题,因为……这根本无法编译
你需要在活动的onCreate
中设置按钮和onClickListener
,然后让onClick
通过创建一个你定义的内部类的新实例并调用execute()
来触发AsyncTask
。
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
}
}
}