首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我需要所有这些空方法来为Glide创建自定义文件目标?

为什么我需要所有这些空方法来为Glide创建自定义文件目标?
EN

Stack Overflow用户
提问于 2019-06-11 05:30:10
回答 1查看 88关注 0票数 0

我正在使用Glide调整图像大小并将其保存到安卓应用程序的文件系统中,我还创建了一个自定义的FileTarget类,该类扩展了Glide的原生Target来完成此操作。

它起作用了。耶!但我对我不得不“定义”的所有空方法感到有点震惊,以使其满足Target实现。我真正关心的是onResourceReady..。

有没有办法在不声明所有这些空方法的情况下实现这一点?我应该担心他们都是这样的吗?

我是Android的新手,所以我很感谢您的耐心。

代码语言:javascript
复制
    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
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-11 05:41:57

在Android框架中,有一种常见的模式,即创建一个抽象的FooAdapter类,该类在一个Foo接口中实现所有的方法,而不使用任何操作。

例如,考虑这个类:

代码语言:javascript
复制
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创建同样的东西:

代码语言:javascript
复制
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,并且只覆盖您关心的方法:

代码语言:javascript
复制
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);
        }
    }

    // ...
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56533782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档