#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