[英]Parameter specified as non-null is null - loading Image in Kotlin
我正在使用Picassos Target從Internet加載圖像並從中生成調色板。 當圖像不再存在時,在Logcat中出現錯誤,並出現以下崩潰:
java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter placeHolderDrawable
at .ActivityThread.performLaunchActivity(ActivityThread.java:3260)
at .ActivityThread.handleLaunchActivity(ActivityThread.java:3396)
at .servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at .servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at .servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at .ActivityThread$H.handleMessage(ActivityThread.java:2009)
at .Handler.dispatchMessage(Handler.java:107)
at .Looper.loop(Looper.java:214)
at .ActivityThread.main(ActivityThread.java:7319)
at .reflect.Method.invoke(Native Method)
at .os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at .os.ZygoteInit.main(ZygoteInit.java:934)
Caused by: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter placeHolderDrawable
at .LoadImage$onCreate$1.onPrepareLoad(Unknown Source:2)
at com.squareup.picasso.RequestCreator.into(RequestCreator.java:559)
at .LoadImage.onCreate(LoadImage.kt:154)
**at .LoadImage.onCreate(LoadImage.kt:154)**
好的,我了解發生了什么-畢加索加載圖片,圖片為空,因此應用程序崩潰。 但是,如何用一行代碼解決這個問題呢?
這是發生問題的部分,我為您標記了第154行:
Picasso.get()
.load(eventimgurl)
**.into(object : com.squareup.picasso.Target {**
override fun onBitmapLoaded(bitmap: Bitmap, from: Picasso.LoadedFrom) {
assert(iconImg != null)
iconImg!!.setImageBitmap(bitmap)
Palette.from(bitmap)
.generate(Palette.PaletteAsyncListener { palette ->
val dividerswatch_dom = palette!!.dominantSwatch
val dividerswatch_sub = palette.lightVibrantSwatch
if (dividerswatch_dom == null || dividerswatch_sub == null) {
return@PaletteAsyncListener
}
val gd = GradientDrawable(
GradientDrawable.Orientation.LEFT_RIGHT,
intArrayOf(dividerswatch_dom.rgb, dividerswatch_sub.rgb))
gd.cornerRadius = 0f
gd.gradientType = GradientDrawable.RADIAL_GRADIENT
gd.gradientRadius = 700.0f
eventdividerheader.background = gd
eventdividerdjstart.background = gd
eventdivider_detail_top.background = gd
eventdivider_detail_bottom.background = gd
})
}
override fun onBitmapFailed(e: Exception, errorDrawable: Drawable) {
}
override fun onPrepareLoad(placeHolderDrawable: Drawable) {
}
})
實際上,問題在於庫代碼與Kotlin不完全兼容。 或實際上,它比您使用的庫更重要的是庫。
為什么?
interface Target {
void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from)
void onBitmapFailed(Exception e, Drawable errorDrawable)
void onPrepareLoad(Drawable placeHolderDrawable)
}
上面的接口將是Target的java接口。 由於Kotlin代碼中沒有使用null注釋的技巧,因此可能會非常棘手,因為我們不知道placeHolderDrawable
(和其他變量)的類型是否可為null。
因此,此接口的kotlin實現如下:
object : Target {
// ...
override fun onPrepareLoad(placeHolderDrawable: Drawable) {
}
}
要么...
object : Target {
// ...
override fun onPrepareLoad(placeHolderDrawable: Drawable?) {
}
}
我們到了。 當Kotlin編譯為Java字節代碼時,它將not-null checks
not-null types
添加not-null checks
:
kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull(param)
因此,為了使您的代碼正常工作...只需將Drawable
更改為Drawable?
。 這樣,將不會有Intrinsics
調用,也不會有異常。
因此,即使您的方法是空的編譯器,也將在Intrinsics
檢查所有非null參數。 隨意反編譯代碼並在空方法中找到那些調用:)
結論問題在於,沒有類型為null的代碼將被轉換為非null類型,而不是可為null的類型,因此IDE無法正確生成沒有可nullability annotations
代碼。
像這樣加載圖像之前檢查條件
if (isNullOrEmpty(eventimgurl)) {
// display default image
}
else {
// load you image from url that is eventimgurl
Picasso.with(YourActivity::this)
.load(eventimgurl)
.into(imgView, object: com.squareup.picasso.Callback {
override fun onSuccess() {
// done
}
override fun onError() {
// load default image or do something
}
})
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.