首页 文章

android-java如何取消asynctask

提问于
浏览
0

我有一个AsyncTask执行HttpPost请求,我有一个字段是人们把他们的电子邮件,并有一个方法,检查正确的电子邮件 . 如果电子邮件验证错误,我想要取消我的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?

2 回答

  • 2

    IMO you should check it before running asyncTask ,但是如果你想要你的方式 - 你可以将一些全局变量设置为 false 并返回它,然后在 doInBackground 方法中检查此变量并将其返回到 onPostExecute .

    许多可能性之一:

    private class DownloadFilesTask extends AsyncTask<String,String,String> {
           String email;
           boolean emailValid = true;
    
            @Override
            protected void onPreExecute() {
               super.onPreExecute();
    
               Email= (EditText)findViewById(R.id.email);
               email= Email.getText().toString().trim();
    
    
               if(!isEmailValid(email)) {
                    Toast.makeText(Registration.this,"Not a valid Email",Toast.LENGTH_LONG).show();
                    emailValid = false;
    
                    return;
               }
            }
    
            @Override
            protected String doInBackground(String... params) {
               if(emailValid) {
                   // now you know it isn't valid
                   return "invalid";
               }
            }
    
           // @Override
            protected void onPostExecute(String file_uri) {
                if(file_uri.equals("invalid") {
                    // now you know it isn't valid event here
                }
            }
        }
    
  • 0

    即使您拨打 cancel(true) ,我们也无法取消 AsyncTask . 该线程将继续在后台运行,但不会返回结果 . 我已经在一个月内完成了自己的实验取消它 . 但是,没有什么可以阻止它的线索并让我感到压力 . 所以我决定搬到 IntentService .

    由于 AsyncTask 仅用于短时间内的单个任务,因此比使用 IntentService 更好,这是用于长时间运行的任务 . 但是,如果您想要停止自己的线程中包含的任务,我建议您使用 IntentServiceService .

相关问题