2013-07-01 67 views
0

我有一个asynctasks。在对话片段的OnCreate观点我创造我的AsyncTask 的对象像下面(示例代码)的AsyncTask不取消取消

 @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 

    cashInValidatorListner = new CashInValidatorListner(mSessionManager.getCustomerId(),mSessionManager.getPosId(), this); 
     } 

现在的onclick我正在执行异步TAKS我加入oncancellistner为

@Override 
public void onClick(View v) { 
    if(v==ok) 
    { 
     if(mHomeActivity.mProgressDialog!=null && !mHomeActivity.mProgressDialog.isShowing()){ 
      mHomeActivity.mProgressDialog.show(); 
     } 
     cashInValidatorListner.execute(); 
    } 
    } 

这个进度

 @Override 
public void onCancel(DialogInterface dialog) { 

    if(dialog==mProgressDialog) 
    { 
     mDialogExtraOptions.cashInValidatorListner.cancel(true); 
     Toast.makeText(getBaseContext(), "Task Cancled", Toast.LENGTH_SHORT).show(); 
    } 
} 

我第一次取消异步任务上算再次执行它 它howerver取消给出错误说不能执行已经执行的任务。

,当我试图在的onclick每次用户点击OK按钮,问题就解决了 喜欢这个

 @Override 
public void onClick(View v) { 
    if(v==ok) 
    { 
     if(mHomeActivity.mProgressDialog!=null && !mHomeActivity.mProgressDialog.isShowing()){ 
      mHomeActivity.mProgressDialog.show(); 
     } 
      cashInValidatorListner = new CashInValidatorListner(mSessionManager.getCustomerId(),mSessionManager.getPosId(), this); 
     cashInValidatorListner.execute(); 
    } 
    } 

这工作正常创建对象,我的问题是,为什么当我运行的异步任务不执行第一次是第二次?

回答

2

你可能只能在实例的生命周期执行的AsyncTask一次。这可以通过简单地创建Asynctask对象的新实例并执行新创建的对象来解决,就像您所做的那样。

(new CashInValidatorListner(mSessionManager.getCustomerId(),mSessionManager.getPosId(), this)).execute(); 
+0

创建新实例在这里是一个坏主意?我应该尝试创建一个对象并尝试取消一次? – Bora

+0

你可以在同一行上执行,而不是每次将它分配给一个变量 – frogmanx

0

引用形式的文档。

任务只能执行一次(如果 第二试图执行一个异常将被抛出。)

你会得到IllegalStateException异常Cannot execute task: the task is already running

AsyncTask实例只能使用一次。

检查下线程规则的话题。

http://developer.android.com/reference/android/os/AsyncTask.html

要取消的AsyncTask调用cashInValidatorListner,cancel(true)

如果调用取消(真),中断将被发送到后台线程,这可能有助于中断任务。否则,您应该确保在doInBackground()方法中定期检查isCancelled()。

protected Object doInBackground(Object... x) { 
    while (/* condition */) { 
     // work... 
     if (isCancelled()) break; 
    } 
    return null; 
} 

来源:Android - Cancel AsyncTask Forcefully

public final boolean cancel (boolean mayInterruptIfRunning)

试图取消对此任务的执行。 如果任务已完成,已被取消或由于某些其他原因无法取消,此尝试将失败。如果成功,并且此任务在调用取消时尚未开始,则此任务不应运行。如果任务已经开始,则mayInterruptIfRunning参数确定执行此任务的线程是否应该中断以试图停止任务。

使用isCancelled()

public final boolean isCancelled()

返回true之前正常完成这个任务被取消。如果对任务调用cancel(boolean),则应该从doInBackground(Object [])中定期检查此方法返回的值,以尽快结束任务。