我有一个执行HttpPost请求的AsyncTask,我有一个字段是人们把他们的电子邮件放进去,并且还有一个检查正确电子邮件的方法。如果电子邮件验证错误,我想要取消我的AsyncTask。我已经尝试了几件事,没有任何作用,这是我的代码..
//check if email is valid
public boolean isEmailValid(String email) {
boolean isValid = false;
String expression = "^[\\w\\.-]+@([\\w\\-]+\\.)+[A-Z]{2,4}$";
CharSequence inputStr = email;
Pattern pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(inputStr);
if (matcher.matches()) {
return true;
}
return false;
}
// AsyncTask
private class DownloadFilesTask extends AsyncTask<String,String,String> {
String email;
@Override
protected void onPreExecute() {
super.onPreExecute();
Email= (EditText)findViewById(R.id.email);
email= Email.getText().toString().trim();
if(isEmailValid(email)== false){
Toast.makeText(Registration.this,"Not a valid Email",Toast.LENGTH_LONG).show();
// I would like to cancel Async here and return but this is a type Void
}
}
@Override
protected String doInBackground(String... params) {
// HttpPost stuff here I return a type String
}
// @Override
protected void onPostExecute(String file_uri) {
// post stuff
}
}
我的 onPreExecute()属于void类型,我尝试将其更改为类型Boolean但我在不兼容类型上遇到不匹配。我的doinBackground必须有String类型,因为我正在向 onPostExecute 返回一些东西。如果电子邮件返回false任何建议,我只想中止AsyncTask?
答案 0 :(得分:2)
IMO你应该在运行asyncTask
之前检查它,但如果你想按照自己的方式进行检查 - 你可以将一些全局变量设置为false
并将其返回,然后在{ {1}}方法检查此变量并将其返回doInBackground
。
众多可能性中的一种:
onPostExecute
答案 1 :(得分:0)
即使您致电AsyncTask
,我们也无法取消cancel(true)
。该线程将继续在后台运行,但不会返回结果。我已经在一个月内做了自己的实验来取消它。但是,没有什么可以阻止它的线索并让我感到压力。所以我决定转到IntentService
。
由于AsyncTask
仅用于短时间内的单个任务,因此优于使用用于长时间运行任务的IntentService
。但是,如果您想停止自己的线程中包含的任务,我建议您使用IntentService
或Service
。