我使用我自己的通用抽象類(MyAsyncTask),它擴展了AsyncTasks,並且需要一種方法來取消當前正在運行的MyAsyncTasks。擴展AsyncTask類的奇怪行爲
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有一個最終方法取消,其定義與我的界面完全一樣,但我仍然必須在我的界面中實現它類。
public Boolean cancel(Boolean mayInterruptIfRunning) {
return super.cancel(mayInterruptIfRunning);
}
現在我的問題是: 1)爲什麼我能定義這個cancel方法,即使是在超同最後的方法是什麼? 2)如果我做了一些新的MyAsyncTask()函數,將執行哪一個 - 原始的或我的方法。 ?
我試圖模擬普通的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有什麼特別之處,爲什麼我必須重新實現取消方法?
謝謝。