docs: public synchronized static void completion(Postcard postcard) {
          if (null == postcard) {
              throw new NoRouteFoundException(TAG + "No postcard!");
          }
  
          RouteMeta routeMeta = Warehouse.routes.get(postcard.getPath());
          if (null == routeMeta) {    // Maybe its does't exist, or didn't load.
              Class<? extends IRouteGroup> groupMeta = Warehouse.groupsIndex.get(postcard.getGroup());  // Load route meta.
              if (null == groupMeta) {
                  throw new NoRouteFoundException(TAG + "There is no route match the path [" + postcard.getPath() + "], in group [" + postcard.getGroup() + "]");
              } else {
                  // Load route and cache it into memory, then delete from metas.
                  try {
                      if (ARouter.debuggable()) {
                          logger.debug(TAG, String.format(Locale.getDefault(), "The group [%s] starts loading, trigger by [%s]", postcard.getGroup(), postcard.getPath()));
                      }
  
                      IRouteGroup iGroupInstance = groupMeta.getConstructor().newInstance();
                      iGroupInstance.loadInto(Warehouse.routes);
                      Warehouse.groupsIndex.remove(postcard.getGroup());
  
                      if (ARouter.debuggable()) {
                          logger.debug(TAG, String.format(Locale.getDefault(), "The group [%s] has already been loaded, trigger by [%s]", postcard.getGroup(), postcard.getPath()));
                      }
                  } catch (Exception e) {
                      throw new HandlerException(TAG + "Fatal exception when loading group meta. [" + e.getMessage() + "]");
                  }
  
                  completion(postcard);   // Reload
              }
          } else {
              postcard.setDestination(routeMeta.getDestination());
              postcard.setType(routeMeta.getType());
              postcard.setPriority(routeMeta.getPriority());
              postcard.setExtra(routeMeta.getExtra());
  
              Uri rawUri = postcard.getUri();
              if (null != rawUri) {   // Try to set params into bundle.
                  Map<String, String> resultMap = TextUtils.splitQueryParameters(rawUri);
                  Map<String, Integer> paramsType = routeMeta.getParamsType();
  
                  if (MapUtils.isNotEmpty(paramsType)) {
                      // Set value by its type, just for params which annotation by @Param
                      for (Map.Entry<String, Integer> params : paramsType.entrySet()) {
                          setValue(postcard,
                                  params.getValue(),
                                  params.getKey(),
                                  resultMap.get(params.getKey()));
                      }
  
                      // Save params name which need auto inject.
                      postcard.getExtras().putStringArray(ARouter.AUTO_INJECT, paramsType.keySet().toArray(new String[]{}));
                  }
  
                  // Save raw uri
                  postcard.withString(ARouter.RAW_URI, rawUri.toString());
              }
  
              switch (routeMeta.getType()) {
                  case PROVIDER:  // if the route is provider, should find its instance
                      // Its provider, so it must implement IProvider
                      Class<? extends IProvider> providerMeta = (Class<? extends IProvider>) routeMeta.getDestination();
                      IProvider instance = Warehouse.providers.get(providerMeta);
                      if (null == instance) { // There's no instance of this provider
                          IProvider provider;
                          try {
                              provider = providerMeta.getConstructor().newInstance();
                              provider.init(mContext);
                              Warehouse.providers.put(providerMeta, provider);
                              instance = provider;
                          } catch (Exception e) {
                              throw new HandlerException("Init provider failed! " + e.getMessage());
                          }
                      }
                      postcard.setProvider(instance);
                      postcard.greenChannel();    // Provider should skip all of interceptors
                      break;
                  case FRAGMENT:
                      postcard.greenChannel();    // Fragment needn't interceptors
                  default:
                      break;
              }
          }
      }