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) スーパークラスに同じ final メソッドがあるのに、なぜこの 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);
}
}
しかし、この場合、キャンセル メソッドはクラス B で既に実装されているため、クラス D で実装する必要はありません。
ありがとうございました。