synchronized void start() { if (!serviceMgr.isTowerConnected()) throw new IllegalStateException("Service manager must be connected."); IDroneApi droneApi = droneApiRef.get(); if (isStarted(droneApi)) return; try { droneApi = serviceMgr .get3drServices() .registerDroneApi(this.apiListener, serviceMgr.getApplicationId()); droneApi.asBinder().linkToDeath(binderDeathRecipient, 0); } catch (RemoteException e) { throw new IllegalStateException("Unable to retrieve a valid drone handle."); } if (asyncScheduler == null || asyncScheduler.isShutdown()) asyncScheduler = Executors.newFixedThreadPool(1); addAttributesObserver(droneApi, this.droneObserver); resetFlightTimer(); droneApiRef.set(droneApi); }