Фоновая асинхронная задача занимает много времени для полного заполнения

#android #linq #xamarin #android-asynctask

#Android #linq #xamarin #android-асинхронная задача

Вопрос:

Я разрабатываю приложение для Android (Android 6.0 и выше), и у меня проблемы с производительностью при работе с большими XML-файлами. (около 17 МБ)

При запуске приложения требуемый XML-документ загружается из частного хранилища и возвращается список (занимает около 2-3 сек.) и заполняется пользовательским адаптером -> это работает отлично.

Но пользователь может запустить синхронизацию вручную внутри приложения (например: данные были обновлены на сервере)

Для этого я внедрил фоновую службу загрузки, чтобы пользовательский интерфейс оставался отзывчивым во время загрузки. Загруженные данные снова сохраняются в личной папке.

проблема:

Фоновая загрузка работает отлично, и мой пользовательский интерфейс остается отзывчивым, пока я не начну считывать информацию из нового XML-файла.

Я не получаю никакого результата -> даже через 3 минуты функция не возвращает возвращаемое значение, хотя я использую ту же функцию для чтения XML, что и в начале -> GetKontaktliste()

 public class MainActivity : AppCompatActivity
{
alert.SetPositiveButton("Synchronisieren", async (senderAlert, args) =>
                    { new DownloadTask(this).Execute("");}); 
}


public class DownloadTask : AsyncTask
    {
        protected override Java.Lang.Object DoInBackground(params Java.Lang.Object[] @params)
        {

            App_Tools lAppTools = new App_Tools();

            ThreadPool.QueueUserWorkItem(async state =>
            {
                //Download Function -> received XML-Data is saved in local storage
               bool lKontakte = await lAppTools.DownloadKontakte(_context);
               bool lVorgaenge = await lAppTools.DownloadVorgaenge(_context);
               bool lVorgaengeImport = await lAppTools.ImportVorgaenge(_context);

                if (lKontakte == true)
                {

                    //Problem is that i dont get any results back here 

                    List<KontaktItem> lResult = new List<KontaktItem>();
                    LinqAbfragen lLinq = new LinqAbfragen();
                    lLinq.GetKontaktliste();
                }
            });
           return true;
        }
}




 public class LinqAbfragen
    {
             //Read Contacts
            public List<KontaktItem> GetKontaktliste()
            {
                List<KontaktItem> lResult = new List<KontaktItem>();

                //Read from IEnumerable<XElement>
                var KontakteAsXElement = ReadXmlAsXElement("Kontakte.xml", "Kontakt");

                lResult = (from kontakt in KontakteAsXElement
                           select new KontaktItem
                           {
                               AdressNr = kontakt.Element("AdressNr").Value,
                               Vorname = kontakt.Element("Vorname1").Value,
                               Nachname = kontakt.Element("Name1").Value,
                               xmlData = (string)kontakt.ToString()
                           }
            ).ToList();
                return lResu<
            }
    }
  

Комментарии:

1. Не используйте асинхронную задачу для этого. Асинхронная задача предназначена для коротких, быстрых методов. Все асинхронные задачи в приложении выполняются в одном потоке, поэтому, если одна из них занимает слишком много времени, ваша система блокируется. Используйте поток для всего, что в худшем случае займет более нескольких сотен мс. Это включает в себя все, что связано с сетевым вызовом.

2. Я попытался прочитать загруженные контакты внутри нового потока, но ничего не происходит. Функция для чтения XML-файла не возвращает никакого результата:S

3. Вы уверены, что XML-файл успешно удален и правильно сохранен в локальном хранилище?

4. Извините за мой поздний ответ. Да, все было закончено. У меня были проблемы с памятью: S