|
|
|
|
|
by crla
3518 days ago
|
|
I don't believe it is as bad as BoorishBears says. Yes, configuration changes cause a tear down and recreation of your view/controller layers, but there are several patterns to deal with this cleanly (view controllers whose lifecycle spans multiple instance of a view is one of the more common, with the view instances detaching/attaching as they come and go). If you use a Flux like pattern for handling application data state you don't even necessarily have to do that since your views are just observing data stores whose lifetime outlives the views anyway. As for asynchronous handling, there are quite a few popular libraries that are very powerful and make it easy to compose multiple asynchronous operations, update views on changes, etc - RxJava for instance has been pretty popular for the last couple of years and is very powerful, but has a steep learning curve. There are others such as Agera (from Google itself), as well as simpler async libraries like Bolts (similar to .Net task futures). The Android SDK itself does not contain much in the way to help with any of this though (I would avoid pretty much any of the async classes that come with the SDK such as Loaders and AsyncTask) - so you do have to research and learn about third party libraries to get to a state where you can write clean and concise code. |
|
Even your comment kind of alludes to the mess:
Yeah there's RxJava but it doesn't inherently solve the rotation issue because your Observables so you still need to persist the information needed to recreate them. And any long running tasks need a separate solution because tearing down the Observable will reset the operation
Googles app development team made Agera which was widely panned as an inferior NIH RxJava
Having your view's controller persist also requires custom logic because only your application will persist through configuration changes and even then the process can still get killed leaving you with nothing but data stored to disk via Parcelables or your own custom solution.
Android Devs solved asynchronous operations, the problem is keeping those operations going after a configuration change. If the operations reference the view you'll get NPE when the view is destroyed while a job finishes, and if your view references the operation you need to lay down infrastructure to let your asynchronous operations exist completely separate of the view and be able to cache their results for when the view comes back.
It's not impossible, everyone does it somehow, but it's created a lot of divergent theories on how it can be done