0

我正在使用我自己的扩展 AsyncTasks 的通用抽象类 (MyAsyncTask),并且需要一种方法来取消所有当前正在运行的 MyAsyncTasks。

abstract class MyAsyncTask<Params, Progress, Result> 
         extends AsyncTask<Params, Progress, Result> {
    ...
}

所以我决定将所有任务的引用存储在 WeakHashMap 中。由于 MyAsincTask 是一个泛型类,我不能直接将它用作 HasMaps 键类型。关于存储在这个 HashMap 中的对象,我唯一需要知道的是它们有方法

public Boolean cancel(Boolean mayInterruptIfRunning);

我觉得写一个界面是合理的

interface Cancelable {
    public Boolean cancel(Boolean mayInterruptIfRunning);
}

并使 MyAsyncTask 实现它:

abstract class MyAsyncTask<Params, Progress, Result> 
         extends AsyncTask<Params, Progress, Result> implements Cancelable {

    private static WeakHashMap<Cancelable, Void> taskList = new WeakHashMap<Cancelable, Void>();

    public MyAsyncTask() {
        taskList.add(this, null);
    }

    public static void cancelAll() {
            Iterator<Cancelable> iterator = taskList.keySet().iterator();

            while (iterator.hasNext()) {
                Cancelable task = iterator.next();

                if (task != null) {
                    task.cancel(true);
                    iterator.remove();
                }
            }
    }

    ...

}

令人困惑的部分是,即使 AsyncTask 有一个最终方法 cancel,它在我的接口中完全定义,我仍然必须在我的类中实现它。

    public Boolean cancel(Boolean mayInterruptIfRunning) {
            return super.cancel(mayInterruptIfRunning);
    }

现在我的问题是:1)为什么我可以定义这个取消方法,即使超类中有相同的最终方法?2) 哪一个 - 如果我执行 new MyAsyncTask().cancel(); 之类的操作,将执行原始的一个或我的方法;?

我试图在纯 java 中模拟这种情况

abstract interface A {
    public Boolean cancel(Boolean a);
}

abstract class B<T> {
    public final Boolean cancel(Boolean a) {
        System.out.println("B.cacncel called");
        return a;
    }
}

abstract class C<T> extends B<T> implements A {}

class D extends C<Void> {}

class TestApp {
    public static void main(String[] args) {
        D x = new D();
        x.cancel(true);
    }
}

但是在这种情况下,我不必在 D 类中实现取消方法,因为它已经在 B 类中实现了。那么,AsyncTask 有什么特别之处,为什么我必须重新实现取消方法?

谢谢你。

4

1 回答 1

0

不,AsyncTask虽然boolean cancel(boolean)你有Boolean cancel(Boolean)

这个类编译得很好

public class Test {

    public Boolean d(Boolean v) { return false; }

    public boolean d1(boolean v1) { return true; } 

}
于 2012-07-17T18:53:47.133 回答