Nano Hash - криптовалюты, майнинг, программирование

Можем ли мы выполнить AsyncTask в onPostExecute()?

В моей деятельности Android у меня есть одна асинхронная задача, которая загружает HTML-материал некоторого URL-адреса. Однако, если с веб-сайтом что-то не так, он (doInbackground()) просто возвращает строку «ошибка» в onPostExecute(). Метод onPostExecute проверяет возвращаемую строку. Если возвращаемая строка не является «ошибкой», то она выполняет какую-то другую работу, и я хочу, чтобы она выполняла асинхронную задачу для другого URL-адреса.

Хорошо ли это делать?

Вот код AsyncTask:

    private class DataLoader extends AsyncTask<URL,Integer,String>{

    @Override
    protected void onPreExecute(){
        //some Stuff
    }

    @Override
    protected String doInBackground(URL... url) {
        try {
            Document d = Jsoup.connect(url[0].toString()).timeout(0).get();
            String docString = d.toString();

            return docString;

        } catch (Exception e) {
            e.printStackTrace();

            return "error";
        }
    }

    @Override
    protected void onPostExecute(String result){
                     if(!(result == "error")){
                             //Process the result
                     }
                     else{
                       DataLoader g = new DataLoader();

            try {
                g.execute(new URL("http://workingexample.com/"));
            } catch (Exception e1) {
                e1.printStackTrace();
            }
                     }

    }
}

  • Как вы думаете, есть ли смысл вызывать других асинктов? вы можете попробовать подключить другую ссылку в doinbackground 26.05.2013
  • Что вы имеете в виду под подключением? Я не мог понять. 26.05.2013
  • вы можете сделать это в том же самом doInBackground.. почему вам нужно снова вызвать AsyncTask, чтобы сделать это.. опубликуйте свой код AsyncTask.. 26.05.2013

Ответы:


1

Я думаю, что StinePike и bakriOnFire означают что-то вроде этого

@Override
protected String doInBackground(URL... url) {
    String docString = downloadHTML(url[0].toString());

    // Try another url
    if (docString.equals("error")) {
        docString = downloadHTML("http://stackoverflow.com");
    }
    // Try another url
    if (docString.equals("error")) {
        docString = downloadHTML("http://google.com");
    }

    return docString;
}

private String downloadHTML(String url) {
    String docString = null;
    try {
        Document d = Jsoup.connect(url).timeout(0).get();
        docString = d.toString();

    } catch (Exception e) {
        e.printStackTrace();
        docString ="error";
    }
    return docString;
}
26.05.2013

2

Я думаю, что ответ Стефана Лейзенбергера имеет правильную идею, хотя я думаю, что было бы лучше, если бы вы предоставили все URL-адреса в вызове execute, а затем просто обработали их в цикле в своем методе doInBackground.

Таким образом, метод doInBackground может выглядеть примерно так:

protected String doInBackground(URL... urls) {
  int count = urls.length;
  for (int i = 0; i < count; i++) {
    try {
      Document d = Jsoup.connect(urls[i].toString()).timeout(0).get();
      String docString = d.toString();
      return docString;
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  return "error"; // None of the URLs worked.
}

И тогда ваш вызов execute должен выглядеть примерно так:

DataLoader g = new DataLoader();
g.execute(url1, url2, url3);
26.05.2013

3

Методы onPreExecute и onPostExecute находятся в UiThread, так что да, вы можете делать там все, что хотите. Только метод doInBackground - это другой поток, поэтому вам лучше ничего не делать, это повлияет на пользовательский интерфейс, но в остальном все будет в порядке.

26.05.2013
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..