I have an activity that call an `Otto Event` called `LoadAuthenticateEvent` this event then goes to my `ClientManager.java` where the following code is:

```
@Subscribe
public void onLoadAuthenticateEvent(LoadAuthenticateEvent loadAuthenticateEvent) {

    // GCM cannot register on the main thread
    String deviceID = "";
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            String differentId = GCMRegistrationUtil.registerDevice(mContext);
            Log.d(TAG, "Device Id: " + differentId);
        }
    });
    thread.start();

    String email = loadAuthenticateEvent.getEmail();
    String password = loadAuthenticateEvent.getPassword();

    Callback<User> callback = new Callback<User>() {
        @Override
        public void success(User user, Response response) {
            sClient.setOrganization(user.getRole().getOrganization().getSubdomain());
            mBus.post(new LoadedMeEvent(user));
        }

        @Override
        public void failure(RetrofitError retrofitError) {
            mBus.post(new LoadedErrorEvent(retrofitError));
        }
    };

    sClient.authenticate(email, password, deviceID, PLATFORM, callback);
}

```

The problem is that the server needs the `deviceID`, but `GCM` requires that a call be asynchronous and not on the main thread, how should I go about implementing this where I can properly get the deviceID and then pass it to `sClient`? Since it is possible that `deviceID` might be empty.