В платформе Android существует общая схема создания абстрактного класса FooAdapter
, который реализует все методы в интерфейсе Foo
с no-ops.
Например, рассмотрим этот класс:
public abstract class AnimatorListenerAdapter implements Animator.AnimatorListener,
Animator.AnimatorPauseListener {
@Override
public void onAnimationCancel(Animator animation) { }
@Override
public void onAnimationEnd(Animator animation) { }
@Override
public void onAnimationRepeat(Animator animation) { }
@Override
public void onAnimationStart(Animator animation) { }
@Override
public void onAnimationPause(Animator animation) { }
@Override
public void onAnimationResume(Animator animation) { }
}
Вы можете создать то же самое для Glide:
public abstract class TargetAdapter<T> implements Target<T> {
@Override
public void onLoadStarted(Drawable drawable) {}
@Override
public void onLoadFailed(Drawable drawable) {}
@Override
public void onLoadCleared(Drawable drawable) {}
@Override
public void getSize(SizeReadyCallback cb) {}
@Override
public void removeCallback(@NonNull SizeReadyCallback cb) {}
@Override
public void setRequest(@Nullable Request request) {}
@Override
public Request getRequest() {}
@Override
public void onResourceReady(@NonNull T resource, @Nullable Transition<? super T> transition) {}
}
Теперь, когда вы создаете класс FileTarget
, вы можете объявить, что он extends TargetAdapter
, а не implements Target
, и переопределить только те методы, которые вам нужны:
public static class FileTarget<T extends Bitmap> extends TargetAdapter<Bitmap> {
// ...
@Override
public void getSize(SizeReadyCallback cb) {
cb.onSizeReady(width, height);
}
@Nullable
@Override
public Request getRequest() {
return null;
}
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
try {
FileOutputStream out = new FileOutputStream(fileName);
resource.compress(format, quality, out);
out.flush();
out.close();
onFileSaved();
} catch (IOException e) {
e.printStackTrace();
onSaveException(e);
}
}
// ...
}