2013-05-02 102 views
-3

出于某种原因,我致电AsyncTask.cancel的呼叫仅适用于一次,即针对任务的第一个实例,而不再运行。第一项任务取消,并击中onCancelled方法。所有其他人似乎忽略cancel()呼叫,并以onPostExecute结束。AsyncTask.cancel仅适用于一次

的任务是从服务执行:

public class ZitFtpService extends Service implements ZitFtpServiceInterface 
{ 
//Blah blah 

public void connect(String server, int port) 
{ 
    if(!isConnecting){ 
     isConnecting = true; 
     ConnectTask task = new ConnectTask(); 
     task.execute(server, String.valueOf(port)); 
    } 
    } 
    //Blah blah blah 

正如你可以看到它是每当一个新的实例。我看不出为什么第一个人的行为与后来的行为有所不同。该AsyncTask是一个私有内部类:

private class ConnectTask extends AsyncTask<String, String, Boolean> { 

    @Override 
    protected Boolean doInBackground(String... params) { 

     boolean result = false; 

     try { 
      publishProgress(
        "start", "Connecting to "+ params[0] + ":" + params[1]); 
      Log.v("ZIT", params[0] + " " + params[1] + " " + params.length); 
      conn.connect(params[0], Integer.valueOf(params[1]), 1000); 
      result = true; 
      } catch (NumberFormatException e) { 
      Log.e("ZIT", e.getMessage()); 
     } catch (IOException e) { 
       failMessage = e.getMessage(); 
       e.printStackTrace(); 
      } 
     return Boolean.valueOf(result); 
    } 

    private void cancelConnect() { 
     try { 
      conn.disconnect(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      conn = new ZMobileFTPImpl(); 
     } 

     if(!(dialog==null)) { 
      dialog.dismiss(); 
     } 
    } 

    @Override 
    protected void onCancelled() { 
     Log.v("ZIT", "I was cancelled."); 
     isConnecting = false; 
    } 

    @Override 
    protected void onProgressUpdate(String... values) { 

     if(dialog == null) { 
      dialog = new ProgressDialog(progressActivity); 
      dialog.setCancelable(true); 
      dialog.setOnCancelListener(new OnCancelListener() { 

       @Override 
       public void onCancel(DialogInterface dialog) { 
        ConnectTask.this.cancel(true); 
        cancelConnect(); 
        dialog.dismiss(); 

       } 
      }); 
      dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", 
        new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.cancel(); 
       } 
      }); 
     } 

     dialog.setMessage(values[1]); 
     dialog.setCancelable(true); 
     dialog.show(); 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 

     dialog.dismiss(); 
     if(!result) { 
      AlertDialog.Builder builder = 
        new AlertDialog.Builder(progressActivity); 
      builder.setMessage(failMessage).setTitle("Error"); 
      failMessage = ""; 
      builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         dialog.dismiss(); 
        } 
       }); 
      AlertDialog failDialog = builder.create(); 
      failDialog.show(); 
     } 

     isConnecting = false; 
    } 
} 
+0

很难说,但最重要的是在你的代码中的一些错误。您在AsyncTask中使用全局变量,您也可以使用这些变量来确定是否运行新任务。请通过您的任务创建过程进行调试 – httpdispatch 2013-05-02 08:17:25

回答

1

From Doc's

有必须遵循此类才能正常工作的几个线程规则:

  • 的的AsyncTask类必须加载在UI线程上。这从JELLY_BEAN自动完成。
  • 任务实例必须在UI线程上创建。
  • execute(Params...)必须在UI线程上调用。
  • 请勿手动拨打onPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...)
  • 任务只能执行一次(如果第二试图执行一个异常将被抛出。)

所以,你可以通过像

new ConnectTask().execute(params); 
每次创建新实例调用的AsyncTask多次
0

这是故意的,你只能执行的AsyncTask实例一次,就可以运行虽然task.execute多次...

无论如何,我相信你忘了加上super.onCancelled在以下重写:

@Override 
public void onCancelled() { 
    //... 
    super.onCancelled(); 
} 

尝试,如果是帮助,否则你应该分享错误或日志,所以我们可以解决问题,:)

相关问题