我在取消异步任务时遇到问题..
我认为我的问题可能很简单,但我不知道如何编码。
我用
while(!isCancelled())
在我的 doinbackground 中,但问题是异步任务永远不会在执行后加载,中断它的唯一方法是按进度对话框上的取消按钮。
如果我按取消按钮取消异步任务,我需要,如果我没有按取消,它应该正常运行(其中 !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);
}
});
最佳答案
您的代码位于返回 boolean
的循环中。值,但它只返回 true
(因此您退出循环)如果您取消 AsyncTask
。我认为您想要实现的目标与此类似,但假设您想要控制何时退出。所以,你应该定义你自己的boolean
值类范围,例如,定义:
boolean dontExit = true;
然后将循环更改为:
while (!dontExit) {
// Your code
...
}
在你的代码中的某个地方,必须有一些条件才能使 dontExit
值为 false,因此您必须在循环内实现一些逻辑来确定何时退出。例如:
if (number_of_loop_processing > 200)
dontExit = false;
这将使循环结束并转到 onPostExecute()
代码。
不同之处在于,现在 isCancelled()
正如其名称所示,当 AsyncTask
时被调用的doInBackground()
完全取消,因此退出并跳转到onCancelled()
事件,但是当您取消它时就会发生这种情况,因此您无法向其中添加自己的逻辑。
关于java - 取消异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21868347/