Java 取消异步任务
我面临取消任务的问题 我认为我的问题可能很简单,但我不知道如何编写代码 我用Java 取消异步任务,java,android,android-asynctask,progressdialog,Java,Android,Android Asynctask,Progressdialog,我面临取消任务的问题 我认为我的问题可能很简单,但我不知道如何编写代码 我用 while(!isCancelled()) 在我的doinbackground中,但问题是asynctask从不在执行后加载,中断它的唯一方法是按下我的进度对话框上的取消按钮 如果我按cancel按钮取消asynctask,我需要这样做;如果我没有按cancel按钮,它应该会正常工作(其中!isCancelled()检查从未触发) 所以它永远不会正常结束 protected Void doInBackgroun
while(!isCancelled())
在我的doinbackground中,但问题是asynctask从不在执行后加载,中断它的唯一方法是按下我的进度对话框上的取消按钮
如果我按cancel按钮取消asynctask,我需要这样做;如果我没有按cancel按钮,它应该会正常工作(其中!isCancelled()检查从未触发)
所以它永远不会正常结束
protected Void doInBackground(Void... params) {
// Create the array
while( !isCancelled() )
{
UsersPostsGet = new ArrayList<UsersPostsGet>();
try {
// Locate the class table named "Country" in Parse.com
ParseQuery<ParseObject> query = new ParseQuery<ParseObject>(
mainroadfrom.replace(" ", "")
+ mainroadto.replace(" ", ""));
// Locate the column named "ranknum" in Parse.com and order list
// by ascending
//
Date midnight = new Date();
midnight.setHours(0);
midnight.setMinutes(0);
midnight.setSeconds(0);
Date elevenfiftynine = new Date();
elevenfiftynine.setHours(23);
elevenfiftynine.setMinutes(59);
elevenfiftynine.setSeconds(59);
query.whereGreaterThan("createdAt", midnight);
query.whereLessThan("createdAt", elevenfiftynine);
query.orderByDescending("createdAt");
Time dtNow = new Time();
dtNow.setToNow();
ob = query.find();
for (ParseObject country : ob) {
int hoursnow = new Date().getHours();
int minsnow = new Date().getMinutes();
int sumnow = hoursnow * 60 + minsnow;
int hourspost = country.getCreatedAt().getHours();
int minspost = country.getCreatedAt().getMinutes();
int sumpost = hourspost * 60 + minspost;
int total = sumnow - sumpost;
int i = total / 60;
int j = total % 60;
if (i == 0) {
if (j <= 1) {
x = j + " Minute";
}
else {
x = j + " Minutes";
}
}
else {
if (j <= 1) {
x = i + " Hour " + j + " Minute";
}
else {
x = i + " Hours " + j + " Minutes";
}
}
ParseFile image = (ParseFile) country.get("imageattach");
UsersPostsGet map = new UsersPostsGet();
map.setUsername((String) country.get("username"));
map.setUserpost((String) country.get("userpost"));
map.setId((String) country.getObjectId());
map.setStatus((String) country.get("status"));
map.setReport((String) country.get("report"));
map.setDisplayname((String) country.get("displayname"));
map.setPosttime(x);
if (image == null) {
map.seturl("");
}
else {
map.seturl(image.getUrl());
}
map.setIdpost(mainroadfrom.replace(" ", "")
+ mainroadto.replace(" ", ""));
UsersPostsGet.add(map);
}
} catch (ParseException e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
}
return null;
}
调用
cancel
方法时,将执行AsyncTask
的onCancelled
方法,因此您可以区分发生了什么。保留对AsyncTask
的引用,并在按下对话框上的按钮时调用其cancel方法,这样应该可以完成任务
从文件中:
可以通过调用cancel(布尔值)随时取消任务。调用此方法将导致对isCancelled()的后续调用返回true。调用此方法后,将在doInBackground(Object[])返回后调用onCancelled(Object),而不是onPostExecute(Object)。为了确保尽快取消任务,您应该始终定期从doInBackground(Object[])检查isCancelled()的返回值,如果可能的话(例如在循环内)。您的代码在一个循环内,该循环返回一个
布尔值,但它只返回true
(因此退出循环)如果取消异步任务
。我认为您试图实现的目标与此类似,但假设您希望控制何时退出。因此,您应该在类范围内定义自己的布尔值,例如,定义:
boolean dontExit = true;
然后将循环更改为:
while (!dontExit) {
// Your code
...
}
在代码中的某个地方,必须有一些条件使该dontExit
值为false,因此必须在循环中实现一些逻辑,确定何时退出。例如:
if (number_of_loop_processing > 200)
dontExit = false;
这将使循环结束并转到onPostExecute()
code
不同之处在于,现在调用isCancelled()
时,正如其名称所示,AsyncTask
的doInBackground()
被完全取消,因此它退出并跳转到onCancelled()
事件,但此时会发生这种情况,当您取消它时,您无法将自己的逻辑添加到其中。我已将其添加到post…我的问题是,我的asynctask在post执行时从未正常完成,我必须按警报对话框中的取消按钮来取消它。您还应该包括isCancelled()
code,看看你是如何处理该循环的取消的。在我的问题中添加了代码安卓系统中正确取消和异步任务的一个很好的例子安卓系统中正确取消和异步任务的一个很好的例子谢谢Ameen。我的问题是,我的异步任务在执行后从未正常完成,我必须按取消按钮t在我的警报对话框中单击以取消它(使while检查为true)。我将尝试以这种方式实现它,并查看它是否有效。。谢谢您的帮助!“完全取消,因此它退出并跳转到onPostExecute()”-如果取消了“AsyncTask”onPostExecute(…)
从未调用过-而是调用了onCancelled(…)
。
if (number_of_loop_processing > 200)
dontExit = false;