簡體   English   中英

擴展AsyncTask類的奇怪行為

[英]Strange behaviour of extended AsyncTask class

我正在使用自己的通用抽象類(MyAsyncTask),該類擴展了AsyncTasks,並且需要一種取消所有當前正在運行的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)為什么即使超類中有相同的最終方法,我也可以定義此cancel方法? 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中實現cancel方法,因為它已經在類B中實現。那么,AsyncTask有什么特別之處,為什么我必須重新實現cancel方法?

謝謝。

不, AsyncTask具有boolean cancel(boolean)而您具有Boolean cancel(Boolean)

這個班編譯不錯

public class Test {

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

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM