kotlin Параметры конструктора отсутствуют? - PullRequest
0 голосов
/ 18 декабря 2018

Я написал MaskShapeTransformation для Glide, поэтому я хочу передать рисование в моем Transformation и нарисовать его с помощью Исходного растрового изображения, чтобы создать эффект маски.

Вначале я передаю рисование, подобное этомуи с SoftReference, чтобы избежать утечки памяти.

class MaskShapeTransformation(drawable: Drawable): BitmapTransformation() {
       private val weakDrawable = SoftReference(drawable)
       .....
}

, но когда я получаю рисование с weakDrawable.get()? рисование было нулевым enter image description here

Я не знаюпочему, но я пробовал все, пока не изменил конструктор, я просто добавляю val к измененному такому элементу рисования, как этот

class MaskShapeTransformation(val drawable: Drawable): BitmapTransformation() {
       private val weakDrawable = SoftReference(drawable)
       .....
}

Произошло нечто удивительное, weakDrawable.get()? работает хорошо!enter image description here

Я очень запутан, Может кто-нибудь сказать мне, почему это?

1 Ответ

0 голосов
/ 18 декабря 2018

Первая точка: WeakReference будет, примерно, сохранять ссылку только до тех пор, пока что-то еще также поддерживает ссылку.

Вторая точка: синтаксис конструктора Kotlin означает, что это очень разные:

  • MaskShapeTransformation(drawable: Drawable)
  • MaskShapeTransformation(val drawable: Drawable)

Первый просто говорит, что вы должны передать конструктору Drawable,Второй тоже это говорит, но также создает поле в классе и инициализирует его переданным значением.Это означает, что вторая форма дает вам объект, который имеет два поля:

  • drawable: содержит передаваемую отрисовку
  • weakDrawable: слабое связывание ссылок drawable.

Сложите их вместе, и теперь у вас есть класс, который имеет сильную ссылку на Drawable, что означает, что слабая ссылка также будет сохранена.

...