Как избежать ANR при длительном анализе XML в AsyncTask андроида?

Я загружаю файлы с сервера, а затем разбору и вставке в локальную БД во время этой операции. Я показываю ход работы с использованием индикатора выполнения. Поскольку файлы очень большие, для анализа используется 2-4 минуты для разбора. Я получаю ANR на индикаторе выполнения а также индикатор выполнения не обновляется после завершения загрузки, он показывает только 50% прогресса. Как избежать этого ANR? Я прикрепляю свой код, как показано ниже ...

@Override
    protected void onPreExecute() 
    {
            flag = false;
            progressCount = 0;
            ProgressDialog progressBar = DdownoadProgressBar(context,
            progressCount);
            progressBar.show(); 

    }

    @Override
    protected Integer doInBackground(String... urls) {
        checkNetworkConnection();

        if (connectionFlag) {
            downloadFile1();
            progressCount = 1;
            publishProgress(progressCount);

            downloadFile2();
            progressCount = 2;
            publishProgress(progressCount);

            downloadFile3();
            progressCount = 3;
            publishProgress(progressCount);

            downloadFile4();
            progressCount = 4;
            publishProgress(progressCount);

            downloadFile5();
            progressCount = 5;
            publishProgress(progressCount);

            downloadFile6();
            progressCount = 6;
            publishProgress(progressCount);

            downloadflag = true;
        }
        return null;
    }


    @Override
    protected void onProgressUpdate(Integer... progress) 
    {
        Log.v(TAG, "In progressUpdate...");

        progressBar.setProgress(progressCount);

    }

    @Override
    protected void onPostExecute(Integer progress) {
        if (downloadflag) {
            try {

                Log.v(TAG, "Inside onPostExecute....");

                 parseFile1();
                 progressCount=7;
                 publishProgress(progressCount);

                 parseFile2();
                 progressCount=8;
                 publishProgress(progressCount);

                 parseFile3();
                 progressCount=9;
                 publishProgress(progressCount);

                 parseFile4();
                 progressCount=10;
                 publishProgress(progressCount);

                 parseFile5();
                 progressCount=11;
                 publishProgress(progressCount);

                 parseFile6();
                 progressCount=12;
                 publishProgress(progressCount);

                 progressBar.dismiss();
                 Toast.makeText(SynchronizeData.this,"Data is successfully downloaded from server.......", Toast.LENGTH_LONG).show();

            } catch (Exception e) {

                e.printStackTrace();
            }
        } else {

            progressBar.dismiss();

            Toast.makeText(
                    getApplicationContext(),
                    "File is not downloaded....Error in network connection...........",Toast.LENGTH_LONG).show();
            Log.v(TAG, "File is not downloaded...............");

        }
    }
2
не разбираться в onPostExecute?
добавлено автор njzk2, источник
Я хочу анализировать и вставлять в базу данных для этой цели, я должен передать контекст для этого, поэтому я не могу сделать это в фоновом режиме ....
добавлено автор Narendra, источник

5 ответы

Переместите логику синтаксического анализа в метод doInBackground. Нет причин делать веб-звонки в фоновом потоке и анализировать поток пользовательского интерфейса.

1
добавлено
Поскольку я вставляю анализируемые данные в локальную БД, как только получаю от разбора каждого элемента, мне нужно передать контекст моему обработчику, поэтому я не могу написать свою логику разбора в doInBackground() ...
добавлено автор Narendra, источник

переместите логику разбора в doinBackground (), как показано ниже.

@Override
protected void onPreExecute() 
{
        flag = false;
        progressCount = 0;
        ProgressDialog progressBar = DdownoadProgressBar(context,
        progressCount);
        progressBar.show(); 

}

@Override
protected Integer doInBackground(String... urls) {
    checkNetworkConnection();

    if (connectionFlag) {
        downloadFile1();
        progressCount = 1;
        publishProgress(progressCount);

        downloadFile2();
        progressCount = 2;
        publishProgress(progressCount);

        downloadFile3();
        progressCount = 3;
        publishProgress(progressCount);

        downloadFile4();
        progressCount = 4;
        publishProgress(progressCount);

        downloadFile5();
        progressCount = 5;
        publishProgress(progressCount);

        downloadFile6();
        progressCount = 6;
        publishProgress(progressCount);

        downloadflag = true;
    }

    if (downloadflag) {
        try {

             parseFile1();
             progressCount=7;
             publishProgress(progressCount);

             parseFile2();
             progressCount=8;
             publishProgress(progressCount);

             parseFile3();
             progressCount=9;
             publishProgress(progressCount);

             parseFile4();
             progressCount=10;
             publishProgress(progressCount);

             parseFile5();
             progressCount=11;
             publishProgress(progressCount);

             parseFile6();
             progressCount=12;
             publishProgress(progressCount);

        } catch (Exception e) {

            e.printStackTrace();
        }
    }
    return null;
}


@Override
protected void onProgressUpdate(Integer... progress) 
{
    Log.v(TAG, "In progressUpdate...");

    progressBar.setProgress(progressCount);

}

@Override
protected void onPostExecute(Integer progress) {

        try {

            Log.v(TAG, "Inside onPostExecute....");


             progressBar.dismiss();
             Toast.makeText(SynchronizeData.this,"Data is successfully downloaded from server.......", Toast.LENGTH_LONG).show();

        } catch (Exception e) {

            e.printStackTrace();
        }

}
1
добавлено

Да, то, что вы делаете без выполнения пользовательского интерфейса, должно выполняться в doInBackground (). Если вы будете выполнять многолетнюю задачу в методе AsyncTask, который работает в основном потоке, тогда он даст вам ANR.

1
добавлено
Поскольку я вставляю анализируемые данные в локальную БД, как только получаю от разбора каждого элемента, мне нужно передать контекст моему обработчику, поэтому я не могу написать свою логику разбора в doInBackground() ...
добавлено автор Narendra, источник
Я сделал это, прежде чем попытался сохранить анализируемые данные в списке массивов, а затем вставить в db за один раз, так как файл большой, я получаю ошибку из памяти ....
добавлено автор Narendra, источник
Почему вы не храните анализируемые данные в databean? А после синтаксического анализа вы можете дать контекст вашему обработчику и сохранить все данные в db за один раз. pasring больше времени, затрачивая их на вставку в db. поэтому сначала запустите все данные, а затем сохраните их в db.
добавлено автор DcodeChef, источник

Как сказал Rich: проанализируйте файлы в doInBackground.

Другой вариант - запустить столько задач async, сколько нужно в onPostExecute.

Но если файлы большие, вам следует подумать об использовании шаблона/сервиса thread/queue-worker!

1
добавлено
точно я хочу использовать этот рабочий поток шаблона для выполнения задачи синтаксического анализа и заставить поток UI знать, что эта задача выполнена, и setProgress строки выполнения, но я не знаю, как это сделать, поскольку я новичок здесь, я искал, но didn Не получишь ничего от этого .... если возможно, скажи мне, как это осуществить.
добавлено автор Narendra, источник
Спасибо, я получил решение, которое я сделал doInBackground() .....
добавлено автор Narendra, источник

Before using an AsyncTask, please read: Is AsyncTask really conceptually flawed or am I just missing something?

Вкратце: вызов AsyncTask из методов Activity концептуально ошибочен, потому что длительная операция может пережить активную деятельность. Такие операции должны отвечать Модели (в смысле MVC), и в этом случае это, вероятно, будет чем-то более серьезным, чем AsyncTask.

0
добавлено
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

Android Developers
Android Developers
4 476 участник(ов)

Общаемся на темы, посвященным Android-разработке, SDK, Kotlin, Realm и т.д.

Android Architecture
Android Architecture
2 186 участник(ов)

Русскоязычный чат по архитектуре в андроид приложениях. Подробнее: http://telegra.ph/Android-Architecture-12-24

rus-speaking/android
rus-speaking/android
1 705 участник(ов)

Основной чат по Android разработке (вопрос-ответ). ПРАВИЛА: bit.ly/andr-rules. NEWS: bit.ly/AnrdResId ЧАТЫ: Основной: bit.ly/andr-main IDE, сборка, Git, сервисы: bit.ly/andr-tools Оффтоп: bit.ly/andr-offtop Конференции, события: bit.ly/andr-events Вакансии, найм: bit.ly/andr-job Архитектура: bit.ly/andr-patterns Rx: bit.ly/andr-rx Тестирование: bit.ly/andr-test Kotlin: bit.ly/andr-kotlin Хаmarin: bit.ly/andr-xamarin За мат, спам, агрессию, предложения о работе, оффтоп в этом канале - бан на сутки и более ☢☢☢

Android Dev Подкаст
Android Dev Подкаст
1 325 участник(ов)

Комната для обсуждения Android Dev подкаста apptractor.ru/AndroidDev/ Общее обсуждение Android: https://t.me/android_ru Остальные чаты про Android: http://t.me/devChats Наши новости https://t.me/androiddevpodcast_news

Android Guards
Android Guards
602 участник(ов)

Обсуждение любых вопросов касающихся безопасности Android. - Защита системы и приложений - Уязвимости и эксплойты - Вредоносное ПО - Копание в кишках системы и приложений (RE)

Android JOB
Android JOB
466 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению Android (full-time, part-time, remote и разовые подработки)

AndroidDev :: Разработка. It's Android time now!
AndroidDev :: Разработка. It's Android time now!
458 участник(ов)

It's Android time now! Чат разработчиков Android. Вакансии, резюме и информацию о митапах размещать можно. Публикацию скрытой и явной рекламы ваших каналов и сайтов после получения разрешения от @olegushakov

Aandroid Talks!
Aandroid Talks!
212 участник(ов)

Чат об общих вопросах по ОС Android. Чат для разработки под андроид - pro.android: https://t.me/joinchat/AAAAAEKIFKnmRT9cMebb9w

Android Rus
Android Rus
68 участник(ов)