Normalerweise delegiere ich alle Activities-Ereignisse an eine separate Controller-Klasse, die eine spezielle Methode zur Behandlung von Ereignissen von Activity
Dies geschieht, um den UI-Thread reaktionsbereit zu halten und alle Berechnungen in Hintergrundaufgaben durchzuführen.
Wenn jedoch die Methode Activity.onDestroy()
vom System aufgerufen wird, wird controller.dispose()
method aufgerufen, was auf diese Weise den gesamten Inhalt des Controllers bereinigt.
Wie Sie sehen, geschieht die Entsorgung des Controllers im UI-Thread, ohne dass er an einen Handler-Thread delegiert wird.
Das Problem tritt auf, wenn beispielsweise onDestroy
in der Mitte von onStartup()
method aufgerufen wird: onDestroy
bereinigt das Modell und alle anderen Referenzen, aber innerhalb von onStartup
versucht es auf das Modell zuzugreifen Irgendein Punkt, aber wenn man bedenkt, dass es null
ist, wird eine Ausnahme ausgelöst.
Was ist der beste Weg, um dieses Problem zu lösen? Ich möchte nicht jede Controller-Methode sperren, da einige von ihnen gleichzeitig auftreten können, ohne sich gegenseitig zu stören.
In der Methode dispose () sollten Sie den workerHandler bereinigen, bevor Sie das Modell entsorgen. Siehe removeCallbacks
oder removeCallbacksAndMessage(null) Methoden in der Handler-Klasse. Die letztere Methode entfernt alle Rückrufe und Nachrichten, wenn das Argument null
ist.
Tags und Links android synchronization concurrency dispose