Зачем мне нужны все эти пустые методы для создания пользовательского целевого файла для Glide? - PullRequest
0 голосов
/ 11 июня 2019

Я использую Glide для изменения размера изображения и сохранения его в файловой системе в приложении Android, и я создал собственный класс FileTarget, который расширяет родной Glide Target, чтобы сделать это.

Оно работает.Ура!Но я как бы потрясен всеми пустыми методами, которые мне пришлось «определить», чтобы он соответствовал реализации Target.Все, что меня действительно волнует, это onResourceReady ...

Есть ли способ реализовать это без объявления всех этих пустых методов?Должен ли я волноваться, что они все такие?

Я немного новичок в Android, поэтому я ценю ваше терпение.

    public static class FileTarget<T extends Bitmap> implements Target<Bitmap> {
    private final int width;
    private final int height;

    String fileName;
    Bitmap.CompressFormat format;
    int quality;

    public FileTarget(int width, int height, String fileName, Bitmap.CompressFormat format, int quality) {
        this.width = width;
        this.height = height;
        this.fileName = fileName;
        this.format = format;
        this.quality = quality;
    }

    @Override
    public void onLoadStarted(Drawable drawable) {}

    @Override
    public void onLoadFailed(Drawable drawable) {}

    @Override
    public void onLoadCleared(Drawable drawable) {}

    @Override
    public void getSize(SizeReadyCallback cb) {
        cb.onSizeReady(width, height);
    }

    @Override
    public void removeCallback(@NonNull SizeReadyCallback cb) {}

    @Override
    public void setRequest(@Nullable Request request) {}

    @Nullable
    @Override
    public Request getRequest() {
        return null;
    }

    @Override
    public void onStart() {}

    @Override
    public void onStop() {}

    @Override
    public void onDestroy() {}

    @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);
        }
    }

    public void onFileSaved() {
        // do nothing, should be overriden
    }
    public void onSaveException(Exception e) {
        // do nothing, should be overriden
    }
}

1 Ответ

1 голос
/ 11 июня 2019

В платформе 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);
        }
    }

    // ...
}
...