0

我想在不使用电子邮件客户端选项的情况下发送电子邮件。我有自己的自定义电子邮件视图。我从这里下载这个想法 。它给 os Network 异常。所以为此我使用 asynctask 并运行它,但我在 Logcat 中收到错误

电子邮件发送.java:

public class EmailSend extends Activity{


Mail m ;


@Override 
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) { 

            new ListViewContactsLoader().execute();

        } 
    }); 
} 



/** An AsyncTask class to retrieve and load listview with contacts */
private class ListViewContactsLoader extends AsyncTask<Void, Void, Boolean>{    

    public ListViewContactsLoader() {

    }

    @Override
    protected Boolean doInBackground(Void... params) {


        try { 
            // m.addAttachment("/sdcard/filelocation"); 

            if(m.send()) { 
                Toast.makeText(EmailSend .this, "Email was sent successfully.", Toast.LENGTH_LONG).show(); 
                return true;
            } else { 
                Toast.makeText(EmailSend .this, "Email was not sent.", Toast.LENGTH_LONG).show(); 

                return false;
            } 
        } 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); 

            return false;
        }
    }




    @Override
    protected void onPostExecute(Boolean result) {          
        // Setting the cursor containing contacts to listview



    }   

    public void onPreExecute() {

        Mail m = new Mail("user@gmail.com", ""); 

        String[] toArr = {"bla@bla.com", "lala@lala.com"}; 
        m.setTo(toArr); 
        m.setFrom("wooo@wooo.com"); 
        m.setSubject("This is an email sent using my Mail JavaMail wrapper from an Android device."); 
        m.setBody("Email body.");
    }


}

}

清单文件:

 <uses-permission android:name="android.permission.WAKE_LOCK" />

  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

<uses-permission android:name="android.permission.READ_CONTACTS" />

日志猫:

   Could not send email

           java.lang.NullPointerException

at com.example.emailer.EmailSend$ListViewContactsLoader.doInBackground(EmailSend.java:54)

at com.example.emailer.EmailSend$ListViewContactsLoader.doInBackground(EmailSend.java:1)

at android.os.AsyncTask$2.call(AsyncTask.java:252)

at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)

at java.util.concurrent.FutureTask.run(FutureTask.java:137)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:574)

at java.lang.Thread.run(Thread.java:1020)
4

4 回答 4

1

它给 os Network 异常

因为目前您正在尝试显示Toast来自doInBackground(来自 UI 线程)方法的消息。使用onPostExecute显示 Toast 消息的方法,因为此方法在 UI 线程上调用。试试看:

@Override
    protected void onPostExecute(Boolean result) {          
        // Setting the cursor containing contacts to listview
         if(result){
           // show Toast Message here
          }else{
           // show Toast Message here
           }
         //.....your code here...
    }  

编辑:NullPointerException可能会忘记在使用它之前初始化类m的对象。Mail在内部初始化m对象onPreExecute,而不是再次创建新实例:

public void onPreExecute() {

    m = new Mail("user@gmail.com", ""); 
  ......
于 2013-04-04T10:24:52.840 回答
1
public void onPreExecute() {

    this.m = new Mail("user@gmail.com", ""); 

    String[] toArr = {"bla@bla.com", "lala@lala.com"}; 
    m.setTo(toArr); 
    m.setFrom("wooo@wooo.com"); 
    m.setSubject("This is an email sent using my Mail JavaMail wrapper from an Android device."); 
    m.setBody("Email body.");
}


}

你不能再制造一个实例!

于 2013-04-04T10:29:25.720 回答
0

您已经实例化了局部变量 Mail m = new Mail("user@gmail.com", ""); 在里面onPreExecute,然后你if(m.send()) {在里面使用doInBackground

Mail m应该是类的属性ListViewContactsLoader

就像是:

public void onPreExecute() {
        m = new Mail("user@gmail.com", ""); 

   private class ListViewContactsLoader extends AsyncTask<Void, Void, Boolean>{  
       private Mail m;
于 2013-04-04T10:27:16.750 回答
0

它给 os Network 异常

因为您正在尝试在 UI 上更新/显示,doInBackground()而无法直接从中进行。

要解决此问题,您可以执行以下任一操作:

  1. 显示来自 onPostExecute() 的 Toast 消息
  2. 或实施runOnUiThread()如果您想从doInBackground()任何方式更新 UI。

例如:

  runOnUiThread(new Runnable() {

        @Override
        public void run() {
            Toast.makeText(EmailSend .this, "Email was sent successfully.", Toast.LENGTH_LONG).show(); 
        }
    });
于 2013-04-04T10:27:44.123 回答