com.bumptech.glide.Registry $ NoModelLoaderAvailableException:找不到任何ModelLoaders

我正在尝试将自定义模型加载到Glide中但是收到此错误:

GlideExecutor:请求抛出未捕获的throwable com.bumptech.glide.Registry $ NoModelLoaderAvailableException:无法find模型的任何ModelLoaders:com.company.project.glide.Movie@aac331a

滑翔版 :4.0.0

我的代码:

模型

public class Movie { private String name; private String artist; public Movie(String name, String artist) { this.name = name; this.artist = artist; } public String getName() { return name; } public String getArtist() { return artist; } } 

 @com.bumptech.glide.annotation.GlideModule public class GlideModule extends AppGlideModule { @Override public boolean isManifestParsingEnabled() { return false; } @Override public void applyOptions(Context context, GlideBuilder builder) { super.applyOptions(context, builder); } @Override public void registerComponents(Context context, Registry registry) { registry.append(Movie.class, InputStream.class, new MovieArtModel.Factory()); } } 

ModelLoader

 public class MovieArtModel implements ModelLoader { @Nullable @Override public LoadData buildLoadData(Movie movie, int width, int height, Options options) { Timber.d("buildLoadData: "); return new LoadData(new ObjectKey(movie), new MovieArtLoader(movie, width, height)); } @Override public boolean handles(Movie movie) { return false; } public static class Factory implements ModelLoaderFactory { @Override public ModelLoader build(MultiModelLoaderFactory multiFactory) { return new MovieArtModel(); } @Override public void teardown() { } } static class MovieArtLoader implements DataFetcher { private Movie movie; private boolean isCancelled = false; private int widthSize; private int heightSize; MovieArtLoader(Movie movie, int widthSize, int heightSize) { Timber.d("MovieArtLoader: Initializing...width size = " + widthSize + " :: heightSize = " + heightSize); this.movie = movie; this.widthSize = widthSize; this.heightSize = heightSize; } @Override public void loadData(Priority priority, DataCallback callback) { Timber.d("loadData"); //First check if request is not cancelled before starting request if(!isCancelled()) { InputStream inputStream = getMovieArtInputStream(movie); if (inputStream != null) { callback.onDataReady(inputStream); } else { callback.onLoadFailed(new IOException("Forced Glide network failure. Can't load Movie image")); } } } return null; } @Override public void cleanup() { Timber.d("cleanup: "); } @Override public void cancel() { Timber.d("cancel: "); isCancelled = true; } @Override public Class getDataClass() { return null; } @Override public DataSource getDataSource() { return null; } private boolean isCancelled() { return isCancelled; } } 

然后我加载它:

 GlideApp.with(itemView.getContext()) .asBitmap() .load(new Movie(book.getMovieName(), book.getArtist())) .placeholder(R.drawable.movie_default_small) .diskCacheStrategy(DiskCacheStrategy.RESOURCE) .listener(this) .into(imageView); 

请问我在哪里弄错了?


编辑

我应用了以下答案,但我开始接受NPE。 这是堆栈跟踪:

 E/GlideExecutor: Request threw uncaught throwable java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Object.hashCode()' on a null object reference at com.bumptech.glide.util.MultiClassKey.hashCode(MultiClassKey.java:66) at android.support.v4.util.SimpleArrayMap.indexOfKey(SimpleArrayMap.java:320) at android.support.v4.util.SimpleArrayMap.get(SimpleArrayMap.java:360) at com.bumptech.glide.provider.LoadPathCache.get(LoadPathCache.java:34) at com.bumptech.glide.Registry.getLoadPath(Registry.java:132) at com.bumptech.glide.load.engine.DecodeHelper.getLoadPath(DecodeHelper.java:132) at com.bumptech.glide.load.engine.DecodeHelper.hasLoadPath(DecodeHelper.java:128) at com.bumptech.glide.load.engine.SourceGenerator.startNext(SourceGenerator.java:59) at com.bumptech.glide.load.engine.DecodeJob.runGenerators(DecodeJob.java:282) at com.bumptech.glide.load.engine.DecodeJob.runWrapped(DecodeJob.java:252) at com.bumptech.glide.load.engine.DecodeJob.run(DecodeJob.java:222) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:818) at com.bumptech.glide.load.engine.executor.GlideExecutor$DefaultThreadFactory$1.run(GlideExecutor.java:347) 

当没有为给定的模型类注册{@ linkcom.bumptech.glide.load.model.ModelLoader}时发生了NoModelLoaderAvailableException,并且使用@talkLittle回答修复了该问题,并且该Movie上的plus应实现equals()hashCode()以获取缓存工作正常。

新的NPE发生是因为您接受@Nullable会尝试@NonNull注释。

 @Override public boolean handles(Movie movie) { return true; } 

你需要这样做,否则Glide会忽略你的ModelLoader,认为它不能处理提供的Movie模型。