java - 取消异步任务

标签 java android android-asynctask progressdialog

我在取消异步任务时遇到问题..

我认为我的问题可能很简单,但我不知道如何编码。

我用

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/

相关文章:

java - 如何在Windows中使用Runtime.getRuntime().exec(command)?

java - 将数据设置为来自一些不同 R.array(XML) 的自定义 ListView 适配器

java - 使用 AsyncTask 获取 JSON 时,ProgressDialog 永远不会被关闭

android - 如何从 AsyncTask Activity 中设置 TextView 的文本?

java - 将 AsyncTask 重置为多次执行

java - java.lang.String类型的值[{在android中无法转换为JSONObject

java - 剪刀石头布游戏(菜单法)

java - 如何使 Thread.sleep() 延迟两个方法之间的执行时间?

java - LineNumberReader setLineNumber 不起作用

android - 图像和视频过滤器,如 android 中的 snapchat