code: public synchronized void makeCustomRequest(AnalyticsRequestData argData) {
          if (!enabled) {
              logger.debug("Ignoring tracking request, enabled is false");
              return;
          }
          if (argData == null) {
              throw new NullPointerException("Data cannot be null");
          }
          if (builder == null) {
              throw new NullPointerException("Class was not initialized");
          }
          final String url = builder.buildURL(argData);
  
          switch(mode){
          	case MULTI_THREAD:
          		Thread t = new Thread(asyncThreadGroup, "AnalyticsThread-" + asyncThreadGroup.activeCount()) {
                      public void run() {
                          synchronized (JGoogleAnalyticsTracker.class) {
                              asyncThreadsRunning++;
                          }
                          try {
                              dispatchRequest(url);
                          } finally {
                              synchronized (JGoogleAnalyticsTracker.class) {
                                  asyncThreadsRunning--;
                              }
                          }
                      }
                  };
                  t.setDaemon(true);
                  t.start();
                  break;
          	case SYNCHRONOUS:
          		dispatchRequest(url);
          		break;
          	default: // in case it's null, we default to the single-thread
          		synchronized (fifo) {
                      fifo.addLast(url);
                      fifo.notify();
                  }
          		if(!backgroundThreadMayRun){
          			logger.error("A tracker request has been added to the queue but the background thread isn't running.", url);
          		}
          		break;
          }
      }
docs: Makes a custom tracking request based from the given data.
  
  @param argData
  @throws NullPointerException
  if argData is null or if the URL builder is null