Ich habe eine Java-Klasse, die Listener mithilfe schwacher Referenzen hält. Wenn ich Kotlin-Lambdas als Listener übergebe, gibt die schwache Referenzmethode get() null zurück. Ich vermute, dass die Objekte im Müll gesammelt werden, obwohl der Aufrufer immer noch einen Verweis auf sie hat. Wenn ich jedoch ein reguläres Kotlin-Objekt anstelle eines Lambda übergebe, tritt dieses Verhalten nicht auf.
companion object {
// This lambda IS being garbage collected after a while
val aLambda: (bundle: Bundle?, caller: Fragment?) -> Unit = { _, _ -> if (something()) processRequest() }
// This object IS NOT being garbage collected
val anObject = object: Notifications.Listener {
override fun onNotification(bundle: Bundle?, caller: Fragment?) {
if (something()) processRequest()
}
}
init {
// This Notifications class holds weak references to both the lambda & object the same way
Notifications.addListener(aLambda)
Notifications.addListener(anObject)
}
}
Ich habe eine Java-Klasse, die Listener mithilfe schwacher Referenzen hält. Wenn ich Kotlin-Lambdas als Listener übergebe, gibt die schwache Referenzmethode get() null zurück. Ich vermute, dass die Objekte im Müll gesammelt werden, obwohl der Aufrufer immer noch einen Verweis auf sie hat. Wenn ich jedoch ein reguläres Kotlin-Objekt anstelle eines Lambda übergebe, tritt dieses Verhalten nicht auf. [list] [*]Warum passiert das? [*]Ist dies das erwartete Verhalten in Kotlin? [/list] Kotlin-Code: [code] companion object {
// This lambda IS being garbage collected after a while val aLambda: (bundle: Bundle?, caller: Fragment?) -> Unit = { _, _ -> if (something()) processRequest() }
// This object IS NOT being garbage collected val anObject = object: Notifications.Listener { override fun onNotification(bundle: Bundle?, caller: Fragment?) { if (something()) processRequest() } }
init { // This Notifications class holds weak references to both the lambda & object the same way Notifications.addListener(aLambda) Notifications.addListener(anObject) } } [/code] Java-Code: [code]public class Notifications {
private static ArrayList listenersArray = new ArrayList();
public static void addListener(@NonNull Listener listener) { listenersArray.add(new WeakReference(listener)); }
public static void notify(@Nullable Bundle bundle, @Nullable Fragment caller) { for (WeakReference weakListener : listenersArray) { Listener listener = weakListener.get(); if (listener != null) { listener.onNotification(bundle, caller); } } } } [/code]
Ich habe eine Java-Klasse, die Listener mithilfe schwacher Referenzen hält. Wenn ich Kotlin-Lambdas als Listener übergebe, gibt die schwache Referenzmethode get() null zurück. Ich vermute, dass die...
In Laravel 10 /PHP 8.2 App Ich versuche, Daten in 1 Array mit einem Zusammenbruch in festgelegten Anforderungen zu sammeln, bei denen einige Paramsa chnagiert werden:
$data = []
Meine Java-Anwendung verfügt aufgrund der häufigen Objekterstellung und -entsorgung über eine übermäßige Speicherbereinigung. Daher möchte ich einen Objektpool implementieren, um Objekte...
Ich arbeite derzeit an einem Projekt mit einem Backend in Kotlin Springboot mit OpenApi-generierter API (in YAML), das ich mit einem Android Jetpack Compose-Client verbinden möchte.
Was ich Ich...
Ich arbeite derzeit an einem Projekt mit einem Backend in Kotlin Springboot mit OpenApi-generierter API (in YAML), das ich mit einem Android Jetpack Compose-Client verbinden möchte.
Was ich Ich...