如何解决即使使用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 举报,一经查实,本站将立刻删除。