使用 Glide 加载图像会导致异常
Loading image with Glide causes exception
我正在尝试使用 Glide 从 url 中获取可绘制对象,但它总是失败。
我正在使用最新的 Glide 4.12.0 版:implementation 'com.github.bumptech.glide:glide:4.12.0'
我已经尝试过使用 RequestListener,但一直失败,因此我正在寻找替代方案。
这是我的代码:
comment.imageURL?.takeIf { loadImage }?.let { imageUrl ->
Glide.with(context).load(comment.imageURL).into(object : CustomTarget<Drawable>() {
override fun onLoadFailed(errorDrawable: Drawable?) {
// code
}
override fun onResourceReady(resource: Drawable,
transition: Transition<in Drawable>?) {
// code
}
override fun onLoadCleared(placeholder: Drawable?) {
// code
}
})
}
这是我得到的异常:
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/galdahan/podsync/Models/Comment$Companion$transform;
at com.galdahan.podsync.Models.Comment$Companion.transform(Comment.kt:71)
at com.galdahan.podsync.Models.Comment$Companion.transform$default(Comment.kt:47)
at com.galdahan.podsync.FIREBASE_API.Post_CommnentsApi$observeComments.onDataChange(Post_CommnentsApi.kt:75)
at com.google.firebase.database.Query.onDataChange(com.google.firebase:firebase-database@@19.2.0:179)
at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@19.2.0:75)
at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@19.2.0:63)
at com.google.firebase.database.core.view.EventRaiser.run(com.google.firebase:firebase-database@@19.2.0:55)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.galdahan.podsync.Models.Comment$Companion$transform" on path: DexPathList[[dex file "/data/data/com.galdahan.podsync/code_cache/.overlay/base.apk/classes6.dex", zip file "/data/app/~~u26Hv32StBK7WzdCxOOa-A==/com.galdahan.podsync-gxbX5HkcbxEI2A_Cnrev2A==/base.apk"],nativeLibraryDirectories=[/data/app/~~u26Hv32StBK7WzdCxOOa-A==/com.galdahan.podsync-gxbX5HkcbxEI2A_Cnrev2A==/lib/x86_64, /system/lib64, /system_ext/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:207)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at com.galdahan.podsync.Models.Comment$Companion.transform(Comment.kt:71)
at com.galdahan.podsync.Models.Comment$Companion.transform$default(Comment.kt:47)
at com.galdahan.podsync.FIREBASE_API.Post_CommnentsApi$observeComments.onDataChange(Post_CommnentsApi.kt:75)
at com.google.firebase.database.Query.onDataChange(com.google.firebase:firebase-database@@19.2.0:179)
at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@19.2.0:75)
at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@19.2.0:63)
at com.google.firebase.database.core.view.EventRaiser.run(com.google.firebase:firebase-database@@19.2.0:55)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
从堆栈跟踪中,可以观察到一些事情。
- 您正在从 firebase 加载数据。
- 当 firebase 通知您更改时,您可以通过某种形式将数据映射到 podsync/Models/ 中的模型。
您可以执行以下操作来找出您的问题:
- 注释掉加载图像的代码(滑动实现)
- 注释掉从 firebase 到模型的对象映射
- 从 firebase 记录您的数据,以确保 structure/format 正在加载它们。
此时,您的应用应该不会崩溃。继续;
- 仔细检查来自 firebase 的 Comment 对象,并确定与您的评论模型(数据类型、children/properties、e.t.c 的数量)或您用于映射它的任何模型的差异来自何处.
如果您正在监听 onDataChange
中的数据更改,您可以使用 try/catch 从快照中获取值并在转换之前记录它(正如我之前提到的)。
一旦您确定了预期对象中的字段,相应地更新您的模型,然后访问 imageUrl
属性 并将其传递给 glide。
总而言之,glide 不是这次崩溃的原因,而是您的数据映射到本地模型的方式。
我正在尝试使用 Glide 从 url 中获取可绘制对象,但它总是失败。
我正在使用最新的 Glide 4.12.0 版:implementation 'com.github.bumptech.glide:glide:4.12.0'
我已经尝试过使用 RequestListener,但一直失败,因此我正在寻找替代方案。
这是我的代码:
comment.imageURL?.takeIf { loadImage }?.let { imageUrl ->
Glide.with(context).load(comment.imageURL).into(object : CustomTarget<Drawable>() {
override fun onLoadFailed(errorDrawable: Drawable?) {
// code
}
override fun onResourceReady(resource: Drawable,
transition: Transition<in Drawable>?) {
// code
}
override fun onLoadCleared(placeholder: Drawable?) {
// code
}
})
}
这是我得到的异常:
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/galdahan/podsync/Models/Comment$Companion$transform;
at com.galdahan.podsync.Models.Comment$Companion.transform(Comment.kt:71)
at com.galdahan.podsync.Models.Comment$Companion.transform$default(Comment.kt:47)
at com.galdahan.podsync.FIREBASE_API.Post_CommnentsApi$observeComments.onDataChange(Post_CommnentsApi.kt:75)
at com.google.firebase.database.Query.onDataChange(com.google.firebase:firebase-database@@19.2.0:179)
at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@19.2.0:75)
at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@19.2.0:63)
at com.google.firebase.database.core.view.EventRaiser.run(com.google.firebase:firebase-database@@19.2.0:55)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.galdahan.podsync.Models.Comment$Companion$transform" on path: DexPathList[[dex file "/data/data/com.galdahan.podsync/code_cache/.overlay/base.apk/classes6.dex", zip file "/data/app/~~u26Hv32StBK7WzdCxOOa-A==/com.galdahan.podsync-gxbX5HkcbxEI2A_Cnrev2A==/base.apk"],nativeLibraryDirectories=[/data/app/~~u26Hv32StBK7WzdCxOOa-A==/com.galdahan.podsync-gxbX5HkcbxEI2A_Cnrev2A==/lib/x86_64, /system/lib64, /system_ext/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:207)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at com.galdahan.podsync.Models.Comment$Companion.transform(Comment.kt:71)
at com.galdahan.podsync.Models.Comment$Companion.transform$default(Comment.kt:47)
at com.galdahan.podsync.FIREBASE_API.Post_CommnentsApi$observeComments.onDataChange(Post_CommnentsApi.kt:75)
at com.google.firebase.database.Query.onDataChange(com.google.firebase:firebase-database@@19.2.0:179)
at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@19.2.0:75)
at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@19.2.0:63)
at com.google.firebase.database.core.view.EventRaiser.run(com.google.firebase:firebase-database@@19.2.0:55)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
从堆栈跟踪中,可以观察到一些事情。
- 您正在从 firebase 加载数据。
- 当 firebase 通知您更改时,您可以通过某种形式将数据映射到 podsync/Models/ 中的模型。
您可以执行以下操作来找出您的问题:
- 注释掉加载图像的代码(滑动实现)
- 注释掉从 firebase 到模型的对象映射
- 从 firebase 记录您的数据,以确保 structure/format 正在加载它们。
此时,您的应用应该不会崩溃。继续;
- 仔细检查来自 firebase 的 Comment 对象,并确定与您的评论模型(数据类型、children/properties、e.t.c 的数量)或您用于映射它的任何模型的差异来自何处.
如果您正在监听 onDataChange
中的数据更改,您可以使用 try/catch 从快照中获取值并在转换之前记录它(正如我之前提到的)。
一旦您确定了预期对象中的字段,相应地更新您的模型,然后访问 imageUrl
属性 并将其传递给 glide。
总而言之,glide 不是这次崩溃的原因,而是您的数据映射到本地模型的方式。