2012-07-17 112 views
0

我使用我自己的通用抽象類(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有什麼特別之處,爲什麼我必須重新實現取消方法?

謝謝。

回答

0

不,AsyncTaskboolean cancel(boolean),而你有Boolean cancel(Boolean)

這個類編譯罰款

public class Test { 

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

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

}