取消Asynctask

时间:2014-02-19 00:12:23

标签: java android android-asynctask progressdialog

我正面临取消我的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);
                    }
                });

2 个答案:

答案 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}事件,但是当你取消它时就会发生这种情况,所以你不能为它添加自己的逻辑。