code: synchronized boolean sendPayload(final PayloadData payload) {
  		if (payload == null) {
  			throw new IllegalArgumentException("Payload is null");
  		}
  
  		// we don't allow concurrent payload sending
  		if (isSendingPayload()) {
  			return false;
  		}
  
  		// we mark the sender as "busy" so no other payloads would be sent until we're done
  		sendingFlag = true;
  
  		try {
  			sendPayloadRequest(payload);
  		} catch (Exception e) {
  			ApptentiveLog.e(e, "Exception while sending payload: %s", payload);
  			logException(e);
  
  			// for NullPointerException, the message object would be null, we should handle it separately
  			// TODO: add a helper class for handling that
  			String message = e.getMessage();
  			if (message == null) {
  				message = StringUtils.format("%s is thrown", e.getClass().getSimpleName());
  			}
  
  			// if an exception was thrown - mark payload as failed
  			handleFinishSendingPayload(payload, false, message, -1, null); // TODO: a better approach
  		}
  
  		return true;
  	}
docs: Sends payload asynchronously. Returns boolean flag immediately indicating if payload send was
  scheduled
  
  @throws IllegalArgumentException is payload is null