簡體   English   中英

指定為非null的參數為null-在Kotlin中加載Image

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM