Я использую исполнителя пула потоков, использующего Future и Callable вместо AyscTask, пользуясь возможностью тайм-аута для ожидания ответа, который может занять некоторое время, вызывая мой собственный метод, который работает нормально, называется "isIdOk". Вот как я делаю вызов пула:
public static boolean isOk(final Context context, final String id) {
boolean result = false;
final BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(1);
final ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0, TimeUnit.SECONDS, workQueue);
Future<Boolean> future;
future = threadPoolExecutor.submit(new Callable<Boolean>() {
@Override
public Boolean call() {
return isIdOk(id);
}
});
try {result = future.get(5000,TimeUnit.MILLISECONDS);}
catch (ExecutionException e) {
e.printStackTrace();
}
catch (InterruptedException e) {
e.printStackTrace();
}
catch (TimeoutException e) {
e.printStackTrace();
}
future.cancel(true);
return result;
}
Я вызываю этот метод ( isOk ) примерно 12 раз в минуту и работает отлично, но через некоторое время метод выдает меня:
java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again
в этой строке:
future = threadPoolExecutor.submit(new Callable<Boolean>() {
Окружение памяти Android Studio " Profiler ", я вижу, что " native Память "и" др."увеличивается при каждом вызове этого метода. Я попытался добавить future.cancel (true) безуспешно. Похоже, что пул остается в памяти, даже если он заканчивается.
Кто-нибудь может мне помочь и объяснить, почему? Заранее спасибо