An even better solution is to force the instantiation of the roster after connection, but before login. Pseudocode: con.connect(); con.getRoster(); con.login("myUser","host", "resource");. This way the roster can set up it's listeners before the user is actually connected.
Why not simply setup the roster just before the initial presence is send? Could you test and report back if Setup Roster before sending initial presence · 5ad4e85 · Flowdalic/Smack · GitHub fixes the issue?