Очень быстрая проверка URL

Поэтому я создаю приложение для Android, где мне нужно очень быстро проверить, существует ли файл на удаленном сервере, потому что мне нужно проверить ~ 1000 ссылок, прежде чем приложение станет пригодным для использования.

В настоящее время я вызываю функцию, которая возвращает URL-адрес, если он действителен, и null, если нет.

public String CheckUrl(String url) {
  try {
    URL urll = new URL(url);
    HttpURLConnection huc = (HttpURLConnection) urll.openConnection();

    huc.setRequestMethod("GET");  //OR  huc.setRequestMethod ("HEAD");
    huc.connect();
    int code = huc.getResponseCode();
    System.out.println(code);

    if (code == 200) {
      return url;
    } else {
      return null;
    }
  } catch (Exception e) {
    return null;
  }
}     

и я использую это так:

for (Element episode : episodes) {
  globalEpisodeCounter++;
  localEpisodeCounter++;

  MLP_Episode currentEpisode = new MLP_Episode();

  Elements links = episode.getElementsByTag("a");
  Element linkObj = links.get(0);
  Element thumObj = linkObj.getElementsByTag("img").get(0);
  Element titleObj = linkObj.getElementsByTag("b").get(0);

  int notRealsead = episode.getElementsByClass("btn btn-sm btn-error").size();
  Boolean epReleased = false;
  if (notRealsead == 0) {
    epReleased = true;
  }

  currentEpisode.url = "https://www.newlunarrepublic.fr" + linkObj.attributes().get("href");
  currentEpisode.thumbUrl = "https://www.newlunarrepublic.fr" + thumObj.attributes().get("src");
  currentEpisode.title = titleObj.text();
  currentEpisode.released = epReleased;
  currentEpisode.id_local = localEpisodeCounter;
  currentEpisode.id_global = globalEpisodeCounter;
  currentEpisode.in_season_num = seasonCounter;

  if (epReleased) {
    currentEpisode.url_vo_1080p = CheckUrl(
        "---------/NLR-1080p-" + addZero(seasonCounter) + "x" + addZero(localEpisodeCounter) + ".webm");

  }

  epList.add(currentEpisode);
}                        

В конце и в конце поиска поток поиска вызывает функцию для обновления пользовательского интерфейса.

Но обратная сторона функции заключается в том, что она очень медленная, 1-2 ссылки / сек.

почему от этого зависит возобновление работы приложения?

Tim 26.07.2018 15:42

он отображает доступные эпизоды для воспроизведения, но я нахожу решение

TurtleForGaming Apps 26.07.2018 15:50

Вы можете попробовать проверить связь с URL-адресом, что (возможно) будет быстрее. Вы также можете распределить нагрузку и проверить несколько ссылок одновременно. Кроме того, вы должны показать пользователю, что приложение каким-то образом работает, если это все еще длится вечно, с помощью чего-то вроде индикатора выполнения.

Worthless 26.07.2018 15:51
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
118
1

Ответы 1

Итак, ответ заключался в том, чтобы запустить проверку в отдельном потоке:

Thread thread = new Thread() {
    @Override
    public void run() {
        try {
            currentEpisode.url_vo_1080p = CheckUrl("------------/NLR-1080p-"+addZero(seasonCounter2)+"x"+addZero(localEpisodeCounter2)+".webm");
        }
        catch (Exception e) {}
    }
};

thread.start();

как это решить проблему, если вам нужны данные перед возобновлением?

Tim 26.07.2018 15:52

Это намного быстрее (1 секунда), и мне не нужны данные до того, как они понадобятся мне после

TurtleForGaming Apps 26.07.2018 15:53
Мне нужно проверить ~ 1000 ссылок, прежде чем приложение станет пригодным для использования. - здесь вы сказали, что вам это нужно раньше
Tim 26.07.2018 15:54

да, потому что, если у меня нет ссылок, я не могу обновить пользовательский интерфейс для пользователя, поисковый поток вызывает функцию после того, как все проверки для этого завершены

TurtleForGaming Apps 26.07.2018 15:56

Другие вопросы по теме