我正面临取消我的Asynctask的问题..
我认为我的问题可能很简单,但我无法弄清楚如何编码。
我用
while( !isCancelled() )
在我的doinbackground中,但问题是asynctask永远不会在post执行时加载,而中断它的唯一方法是按下Progress对话框上的cancel按钮。
我需要按下取消按钮取消asynctask并且如果我没有按取消它应该正常行动(其中!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;
}
我的取消代码
mProgressDialog.setButton(DialogInterface.BUTTON_NEGATIVE,
"Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
RemoteDataTask.this.cancel(true);
}
});
答案 0 :(得分:1)
当您调用cancel
方法时,onCancelled
的{{1}}方法会被执行,因此您可以区分发生的事情。保持对AsyncTask
的引用,并在按下对话框上的按钮时调用其取消方法,这应该可以解决问题。
来自文档:
可以通过调用cancel(boolean)随时取消任务。调用此方法将导致后续调用isCancelled()返回true。调用此方法后,将在doInBackground(Object [])返回后调用onCancelled(Object)而不是onPostExecute(Object)。为确保尽快取消任务,应始终定期从doInBackground(Object [])检查isCancelled()的返回值(如果可能)(例如在循环内)。
答案 1 :(得分:1)
您的代码在循环内返回boolean
值,但如果您取消true
,它只返回AsyncTask
(因此您退出循环)。我认为你想要达到的目的与此类似,但假设你想要控制何时退出。因此,您应该在类范围内定义自己的boolean
值,例如,define:
boolean dontExit = true;
然后将你的循环改为:
while (!dontExit) {
// Your code
...
}
在代码中的某个地方,必须有一些条件才能使dontExit
值为false,因此您必须在循环内部实现一些逻辑确定何时退出。例如:
if (number_of_loop_processing > 200)
dontExit = false;
这会使你的循环结束并转到onPostExecute()
代码。
不同之处在于,现在,isCancelled()
被调用时,正如其名称所示,AsyncTask
的{{1}}被完全取消,因此它会退出并跳转到{{1}事件,但是当你取消它时就会发生这种情况,所以你不能为它添加自己的逻辑。