android - 让 Glide 作为所有类的单例工作

标签 android android-glide

我正在开发负责处理Glide图像加载的模块

所有其他类都必须使用GlideFeatureModule来加载图像

GlideFeatureModule

interface IGlideLoad{
    fun load(file: Any):GlideLoadImp
    fun context(context: Fragment):GlideLoadImp
    fun context(context: AppCompatActivity):GlideLoadImp
    fun context(context: Context):GlideLoadImp
    fun placeHolder(drawable: Drawable):GlideLoadImp
    fun placeHolder(drawable: Int):GlideLoadImp
    fun apply(requestOptions: BaseRequestOptions<*>):GlideLoadImp
    fun into(imageView: ImageView):GlideLoadImp
    fun build():GlideLoadImp
}

使用 GlideFeatureModule 的类

glideLoad
         .context(context)
         .load(url)
          .into(profileImage);

现在我陷入了如何使用 Glide 提供的回调

.listener(new RequestListener<Drawable>() {
                        @Override
                        public boolean onLoadFailed(...) {

                        }

                        @Override
                        public boolean onResourceReady(...) {

                        }
                    })

我想使用它有点像

glideLoad.listener(new GlideLoadImp.GlideStatus() {
                        @Override
                        public void onSuccess() {

                        }

                        @Override
                        public void onFailed() {

                        }
                    });

最佳答案

您无需创建自定义回调即可从 RequestListener 接口(interface)获取响应。

那么如何获得回调呢?您可以简单地将此类接口(interface)对象作为方法参数传递,以便可以处理回调。

看下面的例子:

/**
 * Method that loads image explicitly to view passed as parameter provided by string url to be load into.
 * It receives callback as method parameter to handle result.
 * @param view as {@link ImageView} object
 * @param url as {@link String} parameter
 * @param listener as {@link RequestListener} object
 */
public void loadImage(@NonNull ImageView view, String url, RequestListener<Drawable> listener) {
    Glide.with(view.getContext())
            .load(url)
            .listener(listener)
            .into(view);
}

&如何使用它

loadImage(imageView, "myUrl", new RequestListener<Drawable>() { //Here we will get callback
        @Override
        public boolean onLoadFailed(@android.support.annotation.Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
            return false;
        }

        @Override
        public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
            return false;
        }
    });

Edit for O.P.:

您可以尝试一下,假设您现在已经将其用作中介者,如下所示:

class GlideLoad{
    //we store our listener object here to provide callback
    var callback : GlideLoadImp.GlideStatus? = null

    fun listener(listener: GlideLoadImp.GlideStatus?) {
        this.callback = listener
    }
}

我们使用 O.P. 中的方法从外部设置它,

glideLoad.listener(object: GlideLoadImp.GlideStatus() {

        override fun onSuccess() {

        }

        override fun onFailed() {

        }
})

现在,在 RequestListener 回调期间,我们可以提供值或调用我们的回调监听器,如下所示:

class GlideLoad {
... Some code
// some method having our RequestListener implementation
    object: RequestListener<Drawable>() {

        override fun Boolean onLoadFailed(...) {
            callback?.onFailed(you can pass params here if needed)
        }

        override fun Boolean onResourceReady(...) {
            callback?.onSuccess(you can pass params here if needed)
        }
    }
... Some other code
}

关于android - 让 Glide 作为所有类的单例工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55517815/

相关文章:

java - Glide 4.7.1 监听器不适用于 onResourceReady 方法和异常监听器

java - 使用实现而不是编译时无法访问库模块依赖项

java - 如何使用 fragment (Android)在 Activity 之间保留动态Arraylist元素

android - 本地 aar 库的传递依赖

java - 从RequestListener派生的匿名类

android - 将参数传递给 RequestListener Glide

android - 播放 GIF 时 CPU 使用率高

java - 检测用户手指触摸的大小

android - 前 Lollipop 设备上的矢量可绘制对象无法正常工作

android - 为什么我的类路径中有不同版本的 Kotlin JAR?