AsyncTask
предназначен для выполнения не более нескольких секунд операции, выполняемой в фоновом режиме (не рекомендуется для загрузки файлов с сервера в мегабайтах или для выполнения ресурсоемких задач, таких как операции ввода-вывода файла). Если вам нужно выполнить длительную операцию, вам настоятельно рекомендуется использовать нативные потоки Java. Java предоставляет вам различные связанные с потоками классы, чтобы делать то, что вам нужно. Используйте Handler
для обновления пользовательского интерфейса.
Enumerable имеет функцию Max , которая будет делать это.
Если посмотреть на реализацию целочисленного метода с использованием Reflector, метод зацикливается через каждый элемент в источнике IEnumerable и сравнивает его с тем, что ранее было самым высоким значением.
Если вам нужно часто получать максимальное значение, вы можете подумать о создании своего собственного класса списка (или производного от List), который сохраняет максимальный элемент в кэше. Такой класс мог бы выглядеть следующим образом:
public class MaxList<T> : IList<T>, ICollection<T>, IEnumerable<T>
{
T Maximum { get; set; }
List<T> _list;
public T this[int index] { get; set; }
public void Add(T item)
{
if (item > this.Maximum)
{
this.Maximum = item;
}
_list.Add(item);
}
// ... IEnumerable<T>, ICollection<T> and IList<T> members
}
В качестве альтернативы, вы можете напрямую наследовать от List и перезаписать методы Add и Remove (в основном все методы, изменяющие элементы списка) и соответствующим образом обновить кеш.
Если такой подход действительно является выгода зависит от вашего сценария. Это определенно нужно, если у вас очень большой список, который редко обновляется, и вам нужно часто получать максимум. В противном случае используйте уже предложенные решения, потому что они намного проще.