Async and onCreate error



我是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必须定义您想要在后台完成的精确工作,然后当该工作完成时,您希望在主线程上执行什么。你在这里混合AsyncTaskActivity。您已经定义了一个内部类(AsyncTask),但是随后在AsyncTaskdoInBackground方法中,您开始尝试覆盖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
        }
    }
}

最新更新