微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

即使使用AsyncTasks,也要获取a.NetworkOnMainThreadException

如何解决即使使用AsyncTasks,也要获取a.NetworkOnMainThreadException

我已经在android中实现了JSSE,并试图用它发送电子邮件。我的AsyncTask扩展类中的代码无一例外地执行。但是,GmailSender类中的sendMail()方法会引发以下异常

2020-10-16 12:12:53.218 4328-4328/com.example.afresports D/Error: sendingMailError: null
2020-10-16 12:12:53.222 4328-4328/com.example.afresports D/Error: sendingMailError: class android.os.networkonmainthreadException

我不明白为什么会这样,因为我正在doInBackground()方法内的AsyncTask中调用方法。 已添加了附加库,邮件库和激活库,发件人的电子邮件地址已启用“安全性较低的应用程序”权限,并且清单文件中已添加了Internet和网络状态权限。

MyAsyncclass

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event_status_settings_layout);
     
        gMailSender = new GMailSender(sender,password);
        new MyAsyncclass().execute();
}

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

        ProgressDialog pDialog;

        @Override
        protected void onPreExecute() {

            super.onPreExecute();
            pDialog = new ProgressDialog(event_status_settings_activity.this);
            pDialog.setMessage("Please wait...");
            pDialog.show();

        }

        @Override

        protected Void doInBackground(Void... mApi) {

            Pojo_email_verification verification = new Pojo_email_verification(eventId,event_email,code);
            db.collection("Email_Verification").document(eventId).set(verification).addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()) {
                        try {
                            // Add subject,Body,your mail Id,and receiver mail Id.
                            gMailSender.sendMail(subject,body,sender,event_email);
                            Log.d("send",event_email);
                        } catch (Exception ex) {
                            Log.d("exceptionsending",ex.toString());
                            if (!TextUtils.isEmpty(ex.toString())) {
                                Toast.makeText(event_status_settings_activity.this,"Failed to send an email verification code. Try again later.",Toast.LENGTH_LONG).show();
                            }
                        }
                    } else {
                        Toast.makeText(event_status_settings_activity.this,Toast.LENGTH_LONG).show();
                    }

                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Toast.makeText(event_status_settings_activity.this,Toast.LENGTH_LONG).show();
                }
            });


            return null;
        }

        @Override

        protected void onPostExecute(Void result) {

            super.onPostExecute(result);
            pDialog.cancel();
            progressBar.setVisibility(View.GONE);
            Toast.makeText(event_status_settings_activity.this,"Email verification code sent.",Toast.LENGTH_LONG).show();
        }
    }

JSSEProvider.java

public final class JSSEProvider extends Provider {

    public JSSEProvider() {
        super("HarmonyJSSE",1.0,"Harmony JSSE Provider");
        AccessController.doPrivileged(new java.security.PrivilegedAction<Void>() {
            public Void run() {
                put("SSLContext.TLS","org.apache.harmony.xnet.provider.jsse.SSLContextImpl");
                put("Alg.Alias.SSLContext.TLSv1","TLS");
                put("KeyManagerFactory.X509","org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl");
                put("TrustManagerFactory.X509","org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl");
                return null;
            }
        });
    }
}

GMailSender.java

public class GMailSender extends javax.mail.Authenticator {
    private String mailhost = "smtp.gmail.com";
    private String user;
    private String password;
    private Session session;

    static {
        Security.addProvider(new JSSEProvider());
    }

    public GMailSender(String user,String password) {
        this.user = user;
        this.password = password;

        Properties props = new Properties();
        props.setProperty("mail.transport.protocol","smtp");
        props.setProperty("mail.host",mailhost);
        props.put("mail.smtp.auth","true");
        props.put("mail.smtp.port","465");
        props.put("mail.smtp.socketFactory.port","465");
        props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.socketFactory.fallback","false");
        props.setProperty("mail.smtp.quitwait","false");

        session = Session.getDefaultInstance(props,this);
    }

    protected PasswordAuthentication getpasswordAuthentication() {
        return new PasswordAuthentication(user,password);
    }

    public synchronized void sendMail(String subject,String body,String sender,String recipients) throws Exception {
        try{
            MimeMessage message = new MimeMessage(session);
            DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(),"text/plain"));
            message.setSender(new InternetAddress(sender));
            message.setSubject(subject);
            message.setDataHandler(handler);
            if (recipients.indexOf(',') > 0)
                message.setRecipients(Message.RecipientType.TO,InternetAddress.parse(recipients));
            else
                message.setRecipient(Message.RecipientType.TO,new InternetAddress(recipients));
            Transport.send(message);
        }catch(Exception e){
            Log.d("Error","sendingMailError"+ e.getMessage());
        }
    }

    public class ByteArrayDataSource implements DataSource {
        private byte[] data;
        private String type;

        public ByteArrayDataSource(byte[] data,String type) {
            super();
            this.data = data;
            this.type = type;
        }

        public ByteArrayDataSource(byte[] data) {
            super();
            this.data = data;
        }

        public void setType(String type) {
            this.type = type;
        }

        public String getContentType() {
            if (type == null)
                return "application/octet-stream";
            else
                return type;
        }

        public InputStream getInputStream() throws IOException {
            return new ByteArrayInputStream(data);
        }

        public String getName() {
            return "ByteArrayDataSource";
        }

        public OutputStream getoutputStream() throws IOException {
            throw new IOException("Not Supported");
        }
    }
}

解决方法

onComplete()仅在doInBackground完成之后很长时间才会被调用。因此,您的asynctask已完成。

因此,您在onComplete中执行的所有代码都不会在doInBackground中执行,而是在主线程中执行。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。