0

假设我有一堂课叫 MyTask

每次我为 MyTask 新建一个对象时,它都会创建一个线程

boolean mContinueThread = true;

public MyTask (Activity activity) {

    new AsyncTask<Void, Void, Void>() {

        @Override
        protected Void doInBackground(Void... params) {
            Thread thread = new Thread(new Runnable() {

                @Override
                public void run() {

                    while (mContinueThread) {

                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {

                        }
                    }

                }
            });
            thread.start();
            return null;
        };

    }.execute();
}

起初我 new myTask1, myTask2, myTask3 然后添加到列表

List<MyTask> myTasks = new ArrayList<MyTask>;
myTasks.add(myTask1);
myTasks.add(myTask2);
myTasks.add(myTask3);

现在应该有3个线程在后台运行,然后我更新了

myTasks = new ArrayList<MyTask>;

看起来 myTask1、myTask2、myTask3 中的那些线程仍在运行,finalize 永远不会被调用。我知道我可以在更新列表之前将每个 MyTask 对象的 mContinueThread 设置为 true,但我想知道有什么方法(回调?)我可以知道那些 MyTask 对象不再在列表中,然后将 mContinueThread 设置为错误的?

public MyTask (Activity activity) {

    ...

  @Override
protected void finalize() throws Throwable {
    mContinueThread = false;
    super.finalize();
}
4

2 回答 2

1

有一个刚刚启动的异步任务似乎是多余的Thread。您可以通过将线程的 contance 直接放入您中来实现所需的结果AsyncTask$doInBackground()

您可以调用 callAsyncTask$cancel(boolean mayInterrupt)方法,这将产生一个InterruptedException,剩下要做的就是在 catch 中添加一个 return 语句:

    @Override
    protected Void doInBackground(Void... params) {
        try {
             Thread.sleep(1000);
        } catch (InterruptedException e) {
             // cancel was called
             return null;
        }
        return null;
    };

取消这样的任务:

myTasks.get(i).cancel(true);

不要忘记通过true,否则将无法正常工作

于 2013-08-09T06:52:40.147 回答
0

您必须首先为您的 AsyncTask 设置一个变量,以便您可以调用:

myTasks.get(0).getMyAsyncTask().cancel(boolean);

正如您在此处看到的,取消AsyncTask. 调用后cancel(boolean),它将:(来自文档:

调用此方法将导致对 isCancelled() 的后续调用返回 true。onCancelled(Object) 将在 doInBackground 之后调用,而不是 onPostxecute。为确保任务被取消,您应该始终检查 doInBackground 中 isCancelled 的返回值。

因此,您调用cancel(booelan)您的参考变量AsyncTask并在 doInBackground 中,您总是检查 isCancelled() 以停止 doInBackground 方法中的某些进程。

您应该手动处理您的 doInBackground 方法,以停止那里的所有执行。所以如果你有while(true){ do_something },那么它应该变成while(true){ if(!isCancelled()) { do_something } }

于 2013-08-09T06:45:39.877 回答