【问题标题】:android-java how to cancel an asynctaskandroid-java 如何取消异步任务
【发布时间】:2015-06-28 16:40:45
【问题描述】:

我有一个执行 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 返回一些内容。如果电子邮件返回错误的任何建议,我只想中止 AsyncTask?

【问题讨论】:

    标签: java android android-asynctask


    【解决方案1】:

    IMO 你应该在运行 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
                }
            }
        }
    

    【讨论】:

    • 我只是按照您的建议在 Onclick 上进行了检查,并且能够在 Async 开始之前捕获它,谢谢。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多