Я разрабатываю приложение, в котором мне нужно обновлять некоторую информацию каждый раз, когда пользователь входит в систему, я также использую базу данных в телефоне. Для всех этих операций (обновления, получение данных из базы данных и т. Д.) Я использую асинхронные задачи. До сих пор я не понимал, почему мне не следует их использовать, но недавно я испытал, что если я выполняю некоторые операции, некоторые из моих асинхронных задач просто останавливаются при предварительном выполнении и не переходят к doInBackground. Это было слишком странно, чтобы оставить все как есть, поэтому я разработал еще одно простое приложение, чтобы проверить, что не так. И, как ни странно, я получаю такое же поведение, когда общее количество асинхронных задач достигает 5, а 6-я останавливается при предварительном выполнении.
Есть ли у Android ограничение asyncTasks для Activity / App? Или это просто ошибка, и о ней нужно сообщить? Кто-нибудь испытывал ту же проблему и, возможно, нашел способ ее решения?
Вот код:
Просто создайте 5 таких потоков для работы в фоновом режиме:
private class LongAsync extends AsyncTask<String, Void, String>
{
@Override
protected void onPreExecute()
{
Log.d("TestBug","onPreExecute");
isRunning = true;
}
@Override
protected String doInBackground(String... params)
{
Log.d("TestBug","doInBackground");
while (isRunning)
{
}
return null;
}
@Override
protected void onPostExecute(String result)
{
Log.d("TestBug","onPostExecute");
}
}
А затем создайте эту ветку. Он войдет в preExecute и зависнет (в doInBackground не пойдет).
private class TestBug extends AsyncTask<String, Void, String>
{
@Override
protected void onPreExecute()
{
Log.d("TestBug","onPreExecute");
waiting = new ProgressDialog(TestActivity.this);
waiting.setMessage("Loading data");
waiting.setIndeterminate(true);
waiting.setCancelable(true);
waiting.show();
}
@Override
protected String doInBackground(String... params)
{
Log.d("TestBug","doInBackground");
return null;
}
@Override
protected void onPostExecute(String result)
{
waiting.cancel();
Log.d("TestBug","onPostExecute");
}
}
источник
core pool size
илиmaximum pool size
?У @antonyt есть правильный ответ, но если вы ищете простое решение, вы можете проверить Needle.
С его помощью вы можете определить собственный размер пула потоков, и, в отличие от него
AsyncTask
, он работает на всех версиях Android одинаково. С его помощью вы можете говорить такие вещи, как:или что-то вроде
Он может даже больше. Проверьте это на GitHub .
источник
Обновление : Начиная с API 19, размер пула основных потоков был изменен, чтобы отразить количество процессоров на устройстве, минимум 2 и максимум 4 при запуске, при увеличении до максимального значения CPU * 2 +1 - Ссылка
Также обратите внимание, что хотя исполнитель AsyncTask по умолчанию является последовательным (выполняет одну задачу за раз и в том порядке, в котором они поступают), с методом
вы можете предоставить Executor для выполнения ваших задач. Вы можете предоставить THREAD_POOL_EXECUTOR внутренний исполнитель, но без сериализации задач, или вы даже можете создать свой собственный Executor и предоставить его здесь. Однако внимательно обратите внимание на предупреждение в Javadocs.
Еще одна вещь, которую следует отметить, заключается в том, что и платформа, предоставляющая Executors THREAD_POOL_EXECUTOR, и ее серийная версия SERIAL_EXECUTOR (которая по умолчанию для AsyncTask) являются статическими (конструкции уровня класса) и, следовательно, являются общими для всех экземпляров AsyncTask во всем процессе вашего приложения.
источник