2012-02-08 54 views
2

我有一个应用程序连接到Web服务来检索数据。我使用AsyncTask来做到这一点。 以下是一段代码,我使用doInBackground:Android Java AsyncTask isCancelled问题

publishProgress(user.dbsCode() + ": Retrieving Standard Comments"); 
if (!_sync.isCancelled()) { 
    result = _dbFiller.fillStandardCommentsTable(); 
} else { 
    return null; 
} 

当我测试这在我的模拟器,所以它似乎很好地工作。 isCancelled被设置为& onCancelled()被调用。当我测试使用我的Galaxy Tablet(运行3.2 ...我的项目是使用2.2创建的)时,如果isCancelled被设置,它会被击中或错过。

此过程可能需要一段时间,具体取决于特定用户下载的数据量。我做的第一件事是为用户下载一份(我们称之为“作业”)的清单。然后我会调用单独的Web服务来下载“作业”的不同部分。每一步都包含上述代码,我正在检查我的同步任务是否被取消。我真的迷失了。任何有用的意见表示赞赏。即使只是一个方向。我已经对AsyncTasks做了如此多的了解,我的脑袋正在旋转。

回答

0

在什么情况下取消下载?

由于您无法真正控制调度程序,因此您的任务可能会在您能够取消它们之前完成运行。由于真正的硬件可能比你的模拟器更快,这似乎是可能的。

如果我记得,取消已经完成的AsyncTask没有任何作用。你确定你的任务不完整吗?

+0

我实际上是从这一个任务调用多个Web服务。在给每个人打电话之前,我会检查任务是否被取消。出于某种原因,模拟器将在Web服务调用过程中取消。在设置“isCancelled”之前,平板电脑将完成呼叫。仍然不确定为什么一个工作不同于另一个工作。要解决这个问题,我只需要抛出另一个对话框,显示“正在完成当前操作”,直到isCancelled标志被设置。 – Chris 2012-02-10 21:14:08

+0

@Chris我仍然不确定你的问题到底是什么。如果'AsyncTask'在测试之前完成,看它是否被取消(可能来自'doInBackground()'内),那么它就完成了。操作系统不会在中途调用中打断您的代码。这就是为什么你有长时间运行的代码需要调用isCancelled()来知道它是否应该继续。取消发生在'AsyncTask'线程之外,所以你不能对事情发生的顺序做任何假设。 – Argyle 2012-02-10 21:33:49

+0

好吧,让我们说我有一个Web服务,返回一个300条记录,我将插入到数组列表。我有一个方法可以启动一系列事件(用于调用Web服务,解析XML,填充列表等等,全部在不同的类中)。通过我的测试,如果我取消了异步,然后检查我的ArrayList的大小,我将得到一个介于1和300之间的随机数。如果我在平板电脑上取消,则列表将继续填充,直到所有记录都插入ArrayList 。我得到了一个朋友电话(运行2.3),并在手机上获得了与我模拟器相同的结果。 – Chris 2012-02-10 23:42:09